const参考临时和复印-C++
-
24-09-2019 - |
题
请考虑以下代码,
struct foo
{
foo()
{
std::cout << "Constructing!" << std::endl;
}
foo(const foo& f)
{
std::cout << "Copy constructing!" << std::endl;
}
~foo()
{
std::cout << "Destructing.." << std::endl;
}
};
foo get()
{
foo f;
return f;
}
int main()
{
const foo& f = get();
std::cout << "before return" << std::endl;
return 0;
}
输出MSVC
Constructing!
Copy constructing!
Destructing..
before return
Destructing..
输出的海湾合作委员会
Constructing!
before return
Destructing..
结果,在MSVC看起来不正确的。
的问题
- 据我所知,海湾合作委员会产生正确结果在这里。为什么MSVC是给予不同的结果和为什么这是做复制的建设?
const foo& f = get()
和const foo f = get()
生产相同的输出,因为回报价值的最优化。在这种情况下,其写作方式应该是优选的?
任何思想..
解决方案
你MSVC建立没有优化。把他们,你会得到相同的输出。
海湾合作委员会仅仅是执行,默认情况下,RVO在你暂时的。它基本上是这样做:
const foo& f = foo();
MSVC不是。它的制作 foo
在功能、复制以外的功能(因此复制的构造话),毁内 foo
, 然后结合的参考。
这两个产出是正确的。RVO是一个实例,其中标明确允许可观察到的程序行为的改变。
其他提示
Get()功能是建设本地(印建设!), 和返回Foo对象的价值。Foo对象返回必须是创建和完成,所以通过复制建设(印刷副本建设!).注意,这是目值分配给const foo&f在主要的。
在此之前,分配需要的地方,虽然功能必须返回自获得()和地方变量(即foo f;在获得())必须销毁。(打印第1毁..)从有程序终止(即返回,从主要的),然后返回的对象获得通过()以及分配给"f"被摧毁。(打印第2毁...)
你看到不同的输出对这两个编译器是,海湾合作委员会是优化回报值得()是简单地取代 const foo &f = get()
要 const foo &f = foo
;
1)这种情况发生,因为不同的优化战略。因为你没有操作者=,MSVC可以进行重组的代码之类的东西const foo&f(获得()),因此执行的复制onstructor.2)取决于你想要什么,以实现:
const foo& f = get();
f = get(); // Incorrect, const references cannot be reassigned.
const foo g = get();
g = get(); // Correct.
不隶属于 StackOverflow