为什么在MSVC中三元运算符会防止返回值优化(RVO)?请考虑以下完整的示例程序:
#include <iostream>
struct Example
{
Example(int) {}
Example(Example const &) { std::cout << "copy\n"; }
};
Example FunctionUsingIf(int i)
{
if (i == 1)
return Example(1);
else
return Example(2);
}
Example FunctionUsingTernaryOperator(int i)
{
return (i == 1) ? Example(1) : Example(2);
}
int main()
{
std::cout << "using if:\n";
Example obj1 = FunctionUsingIf(0);
std::cout << "using ternary operator:\n";
Example obj2 = FunctionUsingTernaryOperator(0);
}
< p>使用VC 2013编译的方式如下:cl /nologo /EHsc /Za /W4 /O2 stackoverflow.cpp
输出:
using if:
using ternary operator:
copy
显然,三元运算符会阻止RVO,为什么?为什么编译器不能聪明地看到使用三元运算符的函数和使用if语句的函数执行相同的操作,并进行相应的优化?
return Example(i == 1 ? 1 : 2);
,并怀疑这样做可以实现RVO。 - MSaltersExample
有两个构造函数,参数类型不同,那么这将不是一个选项。 - James Kanzereturn Example(i == 1 ? Example(1) : Example("two"))
周围变得有趣。(虽然你不想要,但是可以看看编译器如何处理RVO) - MSalters