(我正在使用 gcc 与-O2
.)
这似乎是一个消除复制构造函数的直接机会,因为访问 a 中字段的值没有副作用。bar
的副本foo
;但复制构造函数is调用,因为我得到了输出meep meep!
.
#include <iostream>
struct foo {
foo(): a(5) { }
foo(const foo& f): a(f.a) { std::cout << "meep meep!\n"; }
int a;
};
struct bar {
foo F() const { return f; }
foo f;
};
int main()
{
bar b;
int a = b.F().a;
return 0;
}
它不是 12.8/15 中描述的两种复制者省略的法律案例:
返回值优化(其中从函数返回自动变量,并且通过直接在返回值中构造自动变量来省略将该自动变量复制到返回值) - 不。f
不是自动变量。
临时初始值设定项(其中将临时值复制到对象,而不是构造临时值并复制它,而是将临时值直接构造到目标中) - 不f
也不是暂时的。b.F()
是一个临时的,但它不会复制到任何地方,它只是访问了一个数据成员,所以当你退出时F()
没有什么可以省略的。
由于复制者省略苹果的法律案件和复制f
的返回值F()
影响程序的可观察行为,标准禁止将其忽略。如果您用一些不可观察的活动替换了打印,并检查了程序集,您可能会发现此复制构造函数已被优化掉。但这是在“as-if”规则下,而不是在复制构造函数省略规则下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)