Будут ли перемещены подобъекты локальных переменных, если они возвращаются из функции?

Стандарт C ++ 11 гласит, что при соблюдении условий исключения из копирования (§12.8/31), реализация должна относиться кreturnЛокальная переменная lvalue и параметры функции в качестве rvalue first (move) и, если разрешение перегрузки не выполняется как подробно, должны затем обрабатывать его как lvalue (copy).

§12.8 [class.copy] p32

Когда критерии для исключения операции копирования выполнены или будут выполнены, за исключением того факта, что исходный объект является параметром функции,и объект, который должен быть скопирован, обозначен lvalue, разрешение перегрузки для выбора конструктора для копии сначала выполняется так, как если бы объект был обозначен rvalue, Если не удается разрешить перегрузку или если тип первого параметра выбранного конструктора не является rvalue-ссылкой на тип объекта (возможно, cv-квалифицированный), разрешение перегрузки выполняется снова, рассматривая объект как lvalue. [Примечание: Это двухэтапное разрешение перегрузки должно выполняться независимо от того, будет ли выполнено копирование. Он определяет конструктор, который будет вызван, если elision не выполняется, и выбранный конструктор должен быть доступен, даже если вызов исключен.—Конечная записка ]

Включает ли это также дочерние подобъекты? Я протестировал со следующим фрагментом:

#include <iostream>

struct traced{
  traced(){ std::cout << "default ctor\n"; }
  traced(traced const&){ std::cout << "copy ctor\n"; }
  traced(traced&&){ std::cout << "move ctor\n"; }
};

struct X{
  traced t;
};

traced f(){
  X x;
  return x.t;
}

int main(){
  traced t = f();
}

Живой пример на Ideone. И ни в GCC 4.7 ToT, ни в Clang 3.1 ToT не будет отображаться «Move Ctor», что позволяет мне полагать, что стандарт не включает подобъекты-члены.

Я что-то упустил? Мой тестовый код не работает? Что именно делает вывод таким, какой он есть?

Ответы на вопрос(1)

Ваш ответ на вопрос