为啥初始化此类时不调用列表初始化?
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 宽度在初始加载时不正确?
为啥在组件加载时不调用 useEffect(()=...,[]) ?