Следующее компилируется и работает как положено:
std::unique_ptr<char> input_to_char_array()
{
std::unique_ptr<char> c;
c.reset(new char('b'));
// c[1].reset(new char[20]());
return c;
}
Но это не так:
std::unique_ptr<char> input_to_char_array()
{
std::unique_ptr<char> c[2];
c[0].reset(new char('b'));
c[1].reset(new char('a'));
return c[0]; // is this considered "return statement's expression is the name of a non-volatile object with automatic storage duration"
}
Вывод g++:error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = char; _Dp = std::default_delete<char>]
Из некоторых исследований SO Возврат unique_ptr из функций и Почему я не могу вернуть unique_ptr из пары? кажется, что это все, что связано с исключением копирования и оптимизацией именованного возвращаемого значения.
Кто-нибудь может подтвердить, верна ли моя догадка. Если да, то каковы именно критерии для copy elison, чтобы можно было применить NRVO?
This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type
- person Taekahn   schedule 14.07.2015c[0]
— это выражение, а не имя. - person Sneftel   schedule 14.07.2015c
будет создан непосредственно в этом месте, и оператор return станет неоперативным. Во втором примере невозможно построить возвращаемое значение в этом месте памяти, так какc
больше (по размеру), чем возвращаемое значение. - person dyp   schedule 14.07.2015return *&c;
предотвращает NRVO, несмотря на то, что функция имеет такое же поведение во всех остальных отношениях. - person dyp   schedule 14.07.2015