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() );