При каких условиях современные компиляторы C++ не выполняют rvo?
Из соображений производительности я заинтересован в том, чтобы убедиться, что RVO выполняется для возвращаемых значений функций. Что может помешать выполнению этой оптимизации современным компилятором C++ (таким как gcc, clang и msvc 2015), о котором мне следует беспокоиться?
Разъяснение: что меня интересует, так это определение (возможно, в конечном итоге посредством статического анализа, но это может произойти позже), когда конкретное значение с дорогим конструктором копирования (но дешевым конструктором перемещения) возвращается из функции, и RVO не выполняется (это означает, что выполняется ненужный вызов конструктора копирования). Это особенно верно, когда вызов std::move() может избежать этой дорогостоящей операции.
Меня особенно интересуют ситуации, когда это фактически выполняется компиляторами, а не ситуации, когда это было бы разрешено спецификацией C++ 11, которые, как мне кажется, являются более широкими, чем ситуации, реализованные на самом деле. Меня также интересуют ситуации, когда компилятор автоматически использует конструктор перемещения, а не конструктор копирования (если это разрешено).