以下初始化在 C++ 中是否等效

anc*_*ild 2 c++ auto list-initialization

我读到列表初始化通常优于使用圆括号的“旧”方式,因为它们不允许缩小转换。该auto关键字具有相似的属性,因为它根本避免了转换。我想知道以下两个语句是否等效:

auto a = SomeClass(arg_a, arg_b);
auto b = SomeClass{arg_a, arg_b};
Run Code Online (Sandbox Code Playgroud)

也就是说,除了 b 与 a 的名称不同这一事实之外;)

通过等效,我的意思是,对于任何参数SomeClass,在任何情况下,我都可以将导致a构造的表达式替换为导致b构造的构造,当然前提是我使用了auto关键字。是这种情况,还是有任何陷阱/注意事项?

Nat*_*ica 5

它们可能相同也可能不同,这取决于类型。例如,如果你有一个std::vectorthen

auto vec1 = std::vector<int>(1, 2);
Run Code Online (Sandbox Code Playgroud)

以以下形式调用构造函数

vector( size_type count,
        const T& value,
        const Allocator& alloc = Allocator());
Run Code Online (Sandbox Code Playgroud)

它创建了一个大小1为 的向量,其元素值为2。和

auto vec1 = std::vector<int>{1, 2};
Run Code Online (Sandbox Code Playgroud)

vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

构造函数被调用,它创建一个2包含元素的大小的向量{1, 2}

  • @ancientchild 是的。如果没有“std::initializer_list”构造函数,那么它们将是相同的。一旦存在“std::initializer_list”构造函数,您就必须小心,或者以不会发生这种情况的方式设计构造函数。 (3认同)