Rag*_*tor 8 c++ c++11 list-initialization
在括号内包装初始化列表有什么影响?它只是列表初始化的另一种形式,还是仅在某些情况下有效?
例如,考虑a:
struct A {
A(float a, float b) {}
};
int main()
{
A b(1.0f, 0.0f); // Direct initalization, finds ctor for (float, float)
A c{1.0f, 0.0f}; // List initalization, finds a matching ctor
A a({1.0f, 0.0f}); // Is this list initalization... which is expanded?
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 10
A a(something)说a来自something.因此,如果我们something用{1.0f, 0.0f}then 替换,我们需要找到一个可以初始化parmeter的构造函数{1.0f, 0.0f}.我们唯一的构造函数是默认的复制和移动构造函数,它们分别取一个const A&和A&&.
所以,做
A a({1.0f, 0.0f});
Run Code Online (Sandbox Code Playgroud)
实际上会创建一个临时的A,然后使用该临时初始化a.在这种情况下,它将使用移动构造函数,因为对象是可移动的,并且移动构造函数在处理rvalues时优先复制构造函数.