return x;
не вызывает конструктор перемещения, потому что x
может не истечь.В общих чертах это просто lvalue, как и любой другой.return std::move( x );
обычно необходимо.( РЕДАКТИРОВАТЬ: , но см. Следующий абзац.)
Существует специальное правило, которое требует, чтобы компилятор выполнял операцию перемещения вместо копирования, если потенциальное удаление не выполняется, §12.8 /32.Я не уверен, почему ты этого не видишь.Возможно, компилятор пропустил это правило, потому что он не ожидает, что пользователь отключит elision.
Можно ожидать, что конструктор копирования A( A const & )
выполнит копию return
, но шаблон A( T && )
реализует совершенныйпересылка.T &&
выводится на A &
, что не const
и, следовательно, лучше соответствует.
Будьте очень осторожны с идеальной пересылкой в сочетании с конструкторами копирования.Я немного удивлен, что язык не имеет к этому особого отношения.Насколько я знаю, решение состоит в том, чтобы использовать SFINAE для отключения шаблона при таких обстоятельствах.