Effective Modern C++ ——条款7 在创建对象时注意区分()和{}
2021-03-30 03:26
标签:mod 吸引力 支持 问题 effective 初始 mode 原子性 main 在本条款的开头书中提到了两个细节性问题: 1、类中成员初始化的时候不能使用小括号。 2、对于原子性类别的对象初始化的时候不能使用= C++规定:任何能解释为声明的语句都要解释为声明。 在你的构造函数中,如果出现形参型别为std::initializer_list,编译器会想尽一切办法调用这个构造函数初始化对象。 下面这种情况就不用多说了: 所以除非你不给他任何机会: 还有一种例外的情况就是在你即支持默认构造函数,有支持带有std::initializer_list类型的构造函数的时候; 使用空大括号构造对象时,会调用默认的构造函数,意义是没有实参,除非你用两个大括号像这样: 关于大括号和小括号区别 在vector中有例子佐证: Effective Modern C++ ——条款7 在创建对象时注意区分()和{} 标签:mod 吸引力 支持 问题 effective 初始 mode 原子性 main 原文地址:https://www.cnblogs.com/Smarc/p/13593830.html杂项
如:class A {
int a(0);//错误
};
如:std::atomic
大括号初始化的特性(以下都是使用{}初始化对象时具备的特性):
1、禁止窄式类别转换
double x,y,z;
int sum(x+y+z);//错误 double之和可能无法用int 表达
2、能避免令人苦恼的解析语法
MyClass w();//你只是想新建一个对象,但是编译器可能会解释为你在声明一个函数
3、std::initializer_list型别对于编译器有着致命吸引力。
class A {
public:
A(int i, double b){};
A(std::initializer_list
class A {
public:
A(int i, bool b){};
A(std::initializer_list
class A {
public:
A(int i, double b){};
A(std::initializer_list
Myclass a{{}}
std::vector
下一篇:C/C++ 弱符号
文章标题:Effective Modern C++ ——条款7 在创建对象时注意区分()和{}
文章链接:http://soscw.com/index.php/essay/69804.html