Пожалуйста, рассмотрите следующий код,
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..
Вывод GCC
Constructing!
before return
Destructing..
Результат, который приходит на MSVC, выглядит некорректным.
Вопросы
- Насколько мне известно, GCC дает здесь правильный результат. Почему MSVC дает разные результаты и почему он создает копии?
const foo& f = get()
иconst foo f = get()
дают одинаковый результат из-за оптимизации возвращаемого значения. В этом случае, какой способ написания следует предпочесть?
Есть идеи..