以下初始化在 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}.