等号在大括号初始化中是否有影响?例如。 'T a = {}'与'T a{}'
Does the equal sign make a difference in brace initialization? eg. 'T a = {}' vs 'T a{}'
以下是在C++11中初始化变量的两种方法:
T a {something};
T a = {something};
我在我能想到的所有场景中测试了这两个,但我没有注意到区别。这个答案表明两者之间有一个微妙的区别:
对于我不太注意
T t = { init };
或T t { init };
样式之间的变量,我发现差异很小,最坏的情况下只会导致编译器发出关于滥用显式构造函数的有用消息。
那么,两者之间有什么区别吗?
我所知道的唯一显著差异是对explicit
构造函数的处理:
struct foo
{
explicit foo(int);
};
foo f0 {42}; // OK
foo f1 = {42}; // not allowed
这类似于"传统"初始化:
foo f0 (42); // OK
foo f1 = 42; // not allowed
参见[over.match.list]/1。
除此之外,C++11中还有一个缺陷(请参阅CWG 1270),它只允许对形式T a = {something}
省略大括号
struct aggr
{
int arr[5];
};
aggr a0 = {1,2,3,4,5}; // OK
aggr a1 {1,2,3,4,5}; // not allowed
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 是否可以在C++中推迟 const 变量的初始化,例如 Java 的"blank final"功能?
- 如何在函数调用之后初始化变量,例如新表达式提供
- 我需要可复制的缓冲区,尽可能轻(例如,不初始化零)
- 等号在大括号初始化中是否有影响?例如。 'T a = {}'与'T a{}'
- 对于静态初始化的大数组(例如65536条目),编译时间非常长
- 控制未初始化堆栈变量的填充值(例如0xCC)
- 如何初始化嵌套结构的unique_ptr(例如二叉树)
- dlib-19.1:从图像初始化dlib::矩阵(例如dlib::cv_image)用于DNN训练