【发布时间】: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