统一初始化语法差异
Uniform initialization syntax difference
A a{ A() };
,
A a( A{} );
避免最烦人的解析?什么时候我应该使用特定的一个?
这两种语法在大多数情况下是等效的,选择哪一种主要取决于个人喜好。如果您正在进行统一初始化,我建议这样做:
A a{ A{} };
否则,可以单独使用括号消除歧义:
A a((A())); // This can't be parsed as a function declaration
注意,有一种情况(我必须说很不可能),你的问题中显示的两种形式是不相等的。如果您的类A
有一个接受initializer_list<A>
的构造函数,那么当使用大括号时,该构造函数将优于复制构造函数:
#include <initializer_list>
#include <iostream>
struct A
{
A() { }
A(std::initializer_list<A> l) { std::cout << "init-list" << std::endl; }
A(A const& a) { std::cout << "copy-ctor" << std::endl; }
};
int main()
{
A a(A{}); // Prints "copy-ctor" (or nothing, if copy elision is performed)
A b{A()}; // Prints "init-list"
}
上述差异在实例中显示。
在大多数情况下它们是等价的,但是A a{ A() };
将更喜欢std::initializer_list
构造函数(如果存在的话),而A a( A{} );
将更喜欢移动/复制构造函数。
当构造结束调用移动/复制构造函数时,可以省略新对象的构造,但这对于std::initializer_list
构造函数是不可能的。
这两种语法都不会被解析为函数声明,因此都避免了最麻烦的解析。
#include <iostream>
#include <initializer_list>
struct A {
A() {
std::cout << "A()n";
}
A(A&&) {
std::cout << "A(A&&)n";
}
A(std::initializer_list<A>) {
std::cout << "A(std::initializer_list<A>)n";
}
};
int main()
{
{A a{ A() };} // Prints "A()n" "A(std::initializer_list<A>)n"
{A a( A{} );} // Prints "A()n" and *possibly*
// (depending on copy elision) "A(A&&)n"
}
相关文章:
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 结构初始化语法
- 将任何类型的表达式放在 c++ 的初始化列表中在语法上是否正确?
- C++图形初始化错误(语法或丢失文件缺陷?
- Visual C++ 模板类成员结构初始化语法糖
- 正确的语法,用于在C 中继承,并具有初始化列表和内存分配
- 关于结构初始化语法复杂性的问题
- C++类初始化语法和错误"does not name a type"
- std::array不再发生初始化程序语法错误
- 使用大括号初始化C++对象(语法)
- 嵌套变体的简明初始化语法
- 在构造函数成员初始化之前调用成员函数的语法
- 为什么类数据成员不能通过直接初始化语法初始化?
- 为什么在使用初始化语法时不调用转换运算符,为什么 clang 错误消息看起来是错误的
- 使用大括号初始化列表或传统的 ctor 语法实例化类型
- 在 CUDA 中初始化 dim3 变量,"dim3 dimGrid(numBlocks);"语法如何工作?
- 如何使用C++中的括号语法初始化POD数组
- 如何正确使用初始化语法初始化结构
- 使用 ={} 语法初始化结构时,幕后发生了什么?
- 使用构造函数语法初始化引用