Почему для каждой функции return by move

Я читал документацию для std::for_each здесь http://en.cppreference.com/w/cpp/algorithm/for_each и увидел, что возвращаемое значение std::move(f)

почему стандарт обеспечивает перемещение входного параметра в возвращаемое значение? Не будет ли он перемещен по умолчанию, так как входной параметр передается по значению?


это приводит меня к нескольким последующим действиям, когда вы компилируете следующее код

Something function(Something something) {
    return something;
} 
  1. оператор return-это шаг в моей системе с самым высоким уровнем оптимизации (-O3), почему большинство компиляторов не выделяют это возвращаемое значение? Локальные значения удаляются, но аргументы функции-нет..

  2. обеспечивает ли C++17 elision в этом случае? Я прочел предложение (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html) но я не полностью понимаю, какие случаи подходят для обязательное Элизии.

Я пробовал это на Apple LLVM version 8.0.0 (clang-800.0.42.1) на моем Mac и g++ 5.4 в Ubuntu 16.04.

1 ответов


это связано с поздним изменением правил семантики перемещения для C++11. исходное предложение перемещения не перемещается автоматически при появлении аргументов функции по значению в предложении return. Однако к концу процесса C++11 эта языковая функция была добавлена.

до добавления языковой функции,for_each "перенесли". В то время был необходим переход к заявлению о возврате. Но это стало ненужным, хотя и безвредным к тому времени C++11 поставляется.

LWG выпуск 2747 исправлено для C++17.

Что касается вашего первого последующего вопроса, я не писатель компилятора, но мое лучшее предположение: в настоящее время не законно выбирать возврат из параметра функции (это я знаю), и я предполагаю, почему это не законно, что никто не понял, как его реализовать, и, следовательно, никто не имел мотивации изменить стандарт, чтобы сделать его законным.

повторный: Нет, C++17 не применяет elision в этом случае. Правила остаются такими же, как для C++11 в этом случае, за исключением того, что лишние перемещения из for_each больше не указано.

из комментариев ниже:

почему вы говорите, что это не законно, чтобы исключить возврат из параметра функции?

Я ссылка N4660, который является C++17, но есть аналогичная формулировка в C++98/03/11/14 ... резервное копирование, недавно защищенный. См.N4659 вместо этого (так же хорошо):

15.8.3 копирование / перемещение elision [class.копировать.elision]

  1. при выполнении определенных критериев реализация может опустить конструкцию копирования / перемещения объекта класса ...

    • на return оператор в функции с типом возвращаемого класса, когда выражение - имя энергонезависимого автоматического объекта (другое чем параметр функции или переменная, введенная исключение-объявление of a проводник (18.3)) с тем же типом (игнорируя CV-квалификацию), что и тип возврата функции, операция копирования/перемещения может быть опущена путем построения автоматического объекта непосредственно в объект возврата вызова функции

этот язык специально запрещает elision из параметров функции.