在括号内包装初始化列表有什么影响?

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时优先复制构造函数.

  • 虽然在技术上是正确的,但是不会调用移动或复制构造函数,因为它们将被省略(甚至在C++ 17中强制复制省略).在C++ 14中,那些构造函数必须仍然可访问,甚至可以在C++中删除17. (3认同)