【发布时间】:2014-04-22 21:30:12
【问题描述】:
考虑以下示例:
#include <cstdlib>
struct A
{
A(int, char*){};
A(const A&){ printf("copy-ctor\n"); }
};
int main()
{
A x = A(5, nullptr);
}
根据 8.5.16(C++11 标准)行
A x = A(5, nullptr);
被视为
A x(A(5, nullptr));
(即创建一个 A 类型的临时对象并将其传递给 A 类型的 copy-ctor 以初始化 x)。然后根据 12.8.31,允许编译器(但不强制)执行称为“复制省略”的优化,以消除创建 A 类型的临时代码,从而有效地使该行代码变为
A x(5, nullptr);
(即没有创建临时对象,也没有调用 copy-ctors)。
现在,假设我在上面的示例中使用了列表初始化,如下所示:
A x = {5, nullptr}; // (1)
或
A x = A{5, nullptr}; // (2)
有人可以引用 C++11 标准中的适当段落,确认或否认 (1) 和/或 (2) 将总是(即不仅当编译器可以进行“复制省略”优化时)被视为
A x(5, nullptr);
(即直接调用 A 的第一个构造函数,不创建临时对象,不复制 A 类型的对象)。
【问题讨论】:
标签: c++ c++11 language-lawyer copy-elision list-initialization