【问题标题】:How does this list-like initialization work?这种类似列表的初始化是如何工作的?
【发布时间】:2020-08-22 10:05:45
【问题描述】:

我知道 C++ 中的几种初始化类型,最近了解了为什么list initialization should be preferred。但是这段代码呢? live demo

#include <iostream>
#include <string>

class A {
public:
    A(int x, std::string y) { std::cout << "normal\n"; }

    A(const A& obj) { std::cout << "copy\n"; }
};

int main(){
    A a({1, "2"}); // strange initialization
}

打印:

normal

它看起来像是某种列表初始化与使用括号的构造函数调用混合在一起。所以我认为它会从{1, "2"} 创建一个A 的临时实例,然后调用复制构造函数。但这不会发生。相反,它的行为类似于列表初始化。也许我只是对语法感到困惑,它 is 列表初始化?

如果是,这里的语法是如何工作的?如果不是,这是什么初始化?

【问题讨论】:

  • 看起来像是某种列表初始化与使用括号的构造函数调用混合在一起。所以我认为它会从 {1, "2"} 创建一个 A 的临时实例,然后调用复制构造函数。我同意,但你忘记了 copy-elision。 ;-)

标签: c++ initialization language-lawyer list-initialization copy-elision


【解决方案1】:

所以我认为它会从{1, "2"} 创建一个A 的临时实例,然后调用复制构造函数。

你是对的。这里a对象是通过构造函数A::A(int x, std::string y)直接初始化的,因为copy elision

你可以用-fno-elide-constructors选项编译(使用pre-C++17模式,因为C++17保证了这种复制省略),你会得到

normal
copy

LIVE

【讨论】:

    【解决方案2】:

    A a({1, "2"}); 实际上是 copy-list-initialization,其中 braced-init-list 用于代替构造函数参数。

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 2021-12-19
      • 2021-10-12
      • 2012-09-23
      • 2013-05-29
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多