在下面的代码中,有pS
and s.pS
保证最后一行相等?换句话说,在声明中S s = S();
,我能否确定暂时S
不会被建造吗?
#include <iostream>
using namespace std;
struct S
{
S() { pS = this; }
S* pS;
};
int main()
{
S s = S();
S* pS = &s;
cout << pS << " " << s.pS << endl;
}
在我测试过的每个编译器中pS == s.pS
,但我对这个标准还不够熟悉,无法让自己确信这是有保证的。
NO
编译器不是有义务的进行复制省略。该标准只是简单地指定,[class.copy]:
当满足某些标准时,实施被允许省略类对象的复制/移动构造[...]
我可以通过禁用复制省略-fno-elide-constructors
,那么两个指针肯定会不同。例如:
$g++ -std=c++11 -Wall -pedantic -fno-elide-constructors -Wall -Wextra main.cpp && ./a.out
0x7fff5a598920 0x7fff5a598930
在一般情况下,如果我们添加S(S&& ) = delete
,那么上面的代码甚至无法编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)