
[英]How are temporary objects created and what's the actual operations that takes place?
[英]In S s = S() is it guaranteed that no temporary will be created?
在下面的代码中, pS
和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
对此进行了测试,但我对标准不够熟悉,以确保能够保证这一点。
没有
编译器没有义务进行复制省略。 标准只是指定,[class.copy]:
当满足某些条件时, 允许实现省略类对象的复制/移动构造[...]
我可以通过-fno-elide-constructors
elide -fno-elide-constructors
禁用copy elision,然后两个指针肯定会有所不同。 例如:
$g++ -std=c++11 -Wall -pedantic -fno-elide-constructors -Wall -Wextra main.cpp && ./a.out
0x7fff5a598920 0x7fff5a598930
在一般情况下,如果我们添加S(S&& ) = delete
,那么上面的代码甚至都不会编译。
无法保证不会有临时性。 但三巨头编译器将优化它(即使使用-O0
开关)。
为了保证没有临时性,只需写:
int main()
{
// ...
S s{};
// ...
}
或者只是S s;
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.