为啥初始化此类时不调用列表初始化?

Posted

技术标签:

【中文标题】为啥初始化此类时不调用列表初始化?【英文标题】:why is list initialization not invoked when initialize this class?为什么初始化此类时不调用列表初始化? 【发布时间】:2020-10-15 07:46:27 【问题描述】:

根据本页https://en.cppreference.com/w/cpp/language/value_initialization中描述的值初始化

如果 T 是没有默认构造函数但有一个构造函数采用 std::initializer_list 的类类型,则执行列表初始化。

所以我期待在下面的代码中初始化类时 sn-p 会调用 Myclass(const std::initializer_list<int> &l) ,但编译器说

> the default constructor of "Myclass" cannot be referenced -- it is a deleted function

这是为什么呢?这是代码,我在windows上用Mingw64 C++11编译的。

#include <iostream>
class Myclass 
    public:
     Myclass() = delete;
     Myclass(Myclass &&m) 
     Myclass(const Myclass &m) 
     Myclass(const std::initializer_list<int> &l)  std::cout << "initializer list"; 
;
int main(int argc, char const *argv[]) 
    Myclass m2 ;
     Myclass m1=;

【问题讨论】:

"如果T是没有默认构造函数的类类型..." 但是T确实有默认构造函数,被删除了。 【参考方案1】:

Myclass 确实有一个默认构造函数;这只是明确标记为delete。所以值初始化的效果应该是:

    如果 T 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数的类类型,则对象为 default-initialized;

在default-initialization 中选择了已删除的默认构造函数,并且程序格式错误。

如果不声明默认构造函数为

class Myclass 
    public:
     // Myclass() = delete;
     Myclass(Myclass &&m) 
     Myclass(const Myclass &m) 
     Myclass(const std::initializer_list<int> &l)  std::cout << "initializer list"; 
;

那么Myclass 没有默认构造函数; (并且没有 implicitly-declared default constructor 因为其他用户声明的构造函数)。然后list-initialization被执行(如你所料),作为效果

所有将std::initializer_list 作为唯一参数或作为第一个参数(如果其余参数具有默认值)的构造函数都经过检查,并由overload resolution 与std::initializer_list 类型的单个参数进行匹配

【讨论】:

【参考方案2】:

结帐this post。简而言之:

如果默认构造函数被显式删除,编译器将假定不存在任何默认构造函数 但是,如果您删除 Myclass() = delete; 行,它将选择最佳构造函数,也就是您的 initialized_list 之一。

【讨论】:

以上是关于为啥初始化此类时不调用列表初始化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的模板不接受初始化列表

为啥我的自定义 UITableViewCell 宽度在初始加载时不正确?

为啥 C++ 列表初始化也会考虑常规构造函数?

为啥在组件加载时不调用 useEffect(()=...,[]) ?

为啥在HUD显示之前显示警报时不显示MBProgressHUD?

为啥工会成员数据没有默认初始化?