C++ 以下初始化是否在C++;

C++ 以下初始化是否在C++;,c++,auto,list-initialization,C++,Auto,List Initialization,我了解到,与使用圆括号的“旧”方法相比,通常列表初始化更受欢迎,因为它们不允许缩小转换范围。 auto关键字具有类似的属性,因为它完全避免了转换。 我想知道以下两种说法是否相等: auto a=SomeClass(arg_a,arg_b); auto b=SomeClass{arg_a,arg_b}; 也就是说,除了b与a的名称不同之外;) 通过等效,我的意思是,对于SomeClass采用的任何参数,在任何情况下,我都可以将导致a构造的表达式替换为导致b构造的表达式,当然前提是我使用了auto

我了解到,与使用圆括号的“旧”方法相比,通常列表初始化更受欢迎,因为它们不允许缩小转换范围。
auto
关键字具有类似的属性,因为它完全避免了转换。 我想知道以下两种说法是否相等:

auto a=SomeClass(arg_a,arg_b);
auto b=SomeClass{arg_a,arg_b};
也就是说,除了b与a的名称不同之外;)

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

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

auto vec1 = std::vector<int>(1, 2);
它创建一个大小为
1
的向量,元素的值为
2
。与

auto vec1 = std::vector<int>{1, 2};
autovec1=std::vector{1,2};

vector(std::initializer\u list init,
常量分配器&alloc=Allocator());

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

非常有趣,我没想过!对于没有以初始值设定项列表作为参数的构造函数的类,它是否等效?@ancientchild是。如果没有
std::initializer\u list
构造函数,则它们将是相同的。一旦有了一个
std::initializer\u list
构造函数,您就必须小心,或者以一种不会发生这种情况的方式设计构造函数。
auto vec1 = std::vector<int>{1, 2};
vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );