Почему троичный оператор предотвращает оптимизацию возвращаемого значения (RVO) в MSVC? Рассмотрим следующую полную примерную программу:
#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);
}
Скомпилирован с VC 2013: cl /nologo /EHsc /Za /W4 /O2 stackoverflow.cpp
Вывод:
using if:
using ternary operator:
copy
Таким образом, очевидно, что троянный оператор каким-то образом предотвращает RVO. Зачем? Почему компилятор не был бы достаточно умен, чтобы увидеть, что функция, использующая тернарный оператор, выполняет ту же функцию, что и оператор if, и оптимизируется соответственно?