【发布时间】:2020-07-04 23:17:50
【问题描述】:
在下面的示例中,我预计只有一个副本构造,因为我认为中间副本将由 copy elided 生成。唯一需要的(我认为?)副本将在 B 的构造函数中初始化成员变量 a。
#include <iostream>
struct A
{
A() = default;
A(A const&) { std::cout << "copying \n"; }
};
struct B
{
B(A _a) : a(_a) {}
A a;
};
struct C : B
{
C(A _a) : B(_a) {}
};
int main()
{
A a{};
C c(a);
}
当我execute this code(使用-O3)时,我看到以下输出
copying
copying
copying
为什么不删除这些中间副本?
【问题讨论】:
-
在这种情况下不能应用省略,并且 as-if 规则也不能应用,因为你有输出。
标签: c++ c++11 copy-elision