Вот пример с ненужным по сути move-конструктором `T(T&&)`, который, тем не менее, логично всё-таки вызывать всегда. И при возврате из функции `f1` (1) и при конструировании объекта от временного объекта (2):
http://pastebin.com/x6va8nir
Дык вот, первый раз (1) реально он вызывается только при компиляции Visual C++ без оптимизаций, а с оптимизацией — нет. Второй раз (2) — только Visual C++ с оптимизацией и без.
А CLang и GCC вызывают вообще только если явно очень попросить — либо (3), либо дать пенделя флагом `no-elide-constructors`.
Свобода!