我读到列表初始化通常比使用圆括号的"旧"方式更受欢迎,因为它们不允许缩小转换范围。auto
关键字具有类似的属性,因为它完全避免了转化。 不知道以下两种说法是否等价:
auto a = SomeClass(arg_a, arg_b);
auto b = SomeClass{arg_a, arg_b};
也就是说,除了 b 与 ;) 的名称不同这一事实之外
等价,我的意思是,无论SomeClass
采取什么论点,在任何情况下,我都可以将导致a构造的表达式替换为导致构造b的构造,当然前提是我使用的是auto
关键字。 是这样吗,还是有任何陷阱/考虑?
它们可能相同,也可能不同,这取决于类型。 例如,如果您有std::vector
则
auto vec1 = std::vector<int>(1, 2);
调用构造函数的形式为
vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
这将创建一个大小为1
的向量,其元素的值为2
。 跟
auto vec1 = std::vector<int>{1, 2};
这
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );
调用构造函数,它创建一个大小2
包含元素的向量{1, 2}
。