gpt4 book ai didi

c++ - std::initializer_list 和 = 运算符

转载 作者:太空狗 更新时间:2023-10-29 23:28:08 26 4
gpt4 key购买 nike

如果我这样做:

 MyClass a=b;

这里使用复制构造函数初始化a,不涉及=运算符重载,对吧?

如果 a 已经初始化,然后我稍后将其分配给其他东西,则将使用 = 运算符。

我看到了this :

S(std::initializer_list<T> l) : v(l) {

像这样使用:

S<int> s = {1, 2, 3, 4, 5}; // direct list-initialization

这很有趣。它是初始化并使用 = 运算符,但它调用的构造函数不是复制构造函数。为什么它不采用这样的语法:

S<int> s {1, 2, 3, 4, 5};

这就是 std::vector constructor 的作用使用 std::initializer_list 可以工作。使用 = 运算符来初始化一个对象,当该运算符不调用复制构造时,这似乎令人困惑,不是吗?

最佳答案

This uses the copy constructor to initialize a, and the = operator overload is not involved, right?

没错。

Why does it not instead take syntax like this: [...]

你可以使用这两种形式,它们大部分是等价的,除了使用 = 的形式被称为 copy-list-initialization,它需要一个非显式构造函数(感谢 Nicol Bolas 的更正)。

另一方面,没有 = 的形式称为 direct-list-initialization,它通过直接从初始化器构造对象来工作(非常直观) (将初始化程序作为参数传递给要初始化的对象的构造函数)。构造函数是否显式与此处无关。

所以简而言之,这两种形式是等价的,除了如果您的构造函数是显式copy-list-initialization 将不起作用。如果不是这种情况,选择哪种形式主要是风格问题。

关于c++ - std::initializer_list 和 = 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com