以下初始化在 C++ 中是否等效
Are the following initializations equivalent in C++
我读到 list-initialization 比 'old' 使用圆括号的方式更受欢迎,因为它们不允许 narrowing conversions 。
auto
关键字具有类似的属性,因为它完全避免了转换。
我想知道以下两个语句是否等价:
auto a = SomeClass(arg_a, arg_b);
auto b = SomeClass{arg_a, arg_b};
也就是说,除了 b 的名称与 a 不同之外;)
等价的意思是,对于 SomeClass
所采用的任何参数,在任何情况下,我都可以将导致 a 构造的表达式替换为构造导致 b 的构造,当然前提是我使用的是 auto
关键字。
是这样吗,还是有什么pitfalls/considerations?
它们可能相同也可能不同,这取决于类型。例如,如果你有一个 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}
.
我读到 list-initialization 比 'old' 使用圆括号的方式更受欢迎,因为它们不允许 narrowing conversions 。
auto
关键字具有类似的属性,因为它完全避免了转换。
我想知道以下两个语句是否等价:
auto a = SomeClass(arg_a, arg_b);
auto b = SomeClass{arg_a, arg_b};
也就是说,除了 b 的名称与 a 不同之外;)
等价的意思是,对于 SomeClass
所采用的任何参数,在任何情况下,我都可以将导致 a 构造的表达式替换为构造导致 b 的构造,当然前提是我使用的是 auto
关键字。
是这样吗,还是有什么pitfalls/considerations?
它们可能相同也可能不同,这取决于类型。例如,如果你有一个 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}
.