12.8 Копирование и перемещение объектов класса [class.copy] §31 и §32 говорят:
в операторе return в функции с типом возвращаемого класса , когда выражение представляет собой имя нелетучего автоматического объекта (кроме функции или параметра catch-clause) с тем же cv-unqualified type в качестве возвращаемого типа функции, операцию копирования/перемещения можно опустить, построив автоматический объект непосредственно в возвращаемое значение функции
Когда критерии для выполнения операции копирования выполняются или выполняются, за исключением того факта, что исходный объект является параметром функции, а подлежащий копированию объект определяется значением lvalue, разрешением перегрузки, чтобы выбрать конструктор для копия сначала выполняется так, как если бы объект был обозначен rvalue.
Следовательно, мы можем написать:
unique_ptr<int> make_answer()
{
unique_ptr<int> result(new int(42));
return result; // lvalue is implicitly treated as rvalue
}
Однако я заметил, что g++ 4.6.3 также принимает lvalues, которые не имена, например:
return (result);
return *&result;
return true ? result : result;
В отличие от этого, return rand() ? result : result;
не работает. Оптимизатор компилятора вмешивается в семантику языка? Поскольку я интерпретирую стандарт, return (result);
не должен компилироваться, потому что (result)
не является именем, а выражением в скобках. Правильно или неправильно?