Насколько я знаю, в c ++ 17 понятие / семантика prvalue больше не временный объект,так что во многих случаях копия права обязательна.
Однако сегодня я наткнулся на описание возвращаемое выражение
Если выражение является значением, объект, возвращаемый функцией инициализируется непосредственно этим выражением. Это не требует копирования или перемещения конструктора, когда типы совпадают
Почему термин объект происходит здесь? В категория стоимости возврат функции, которая не является ссылочным типом, принадлежит prvalue,так что я думаю может быть неуместно использовать термин объект.
Согласно моему пониманию, prvalues больше не объекты теперь они просто ценности, я прав?
В качестве дополнения,Вот также используйте термин «объект».
Я согласен с тем, что вы говорите. На cppreference есть страница обсуждения, где вы можете высказать свои опасения. Лучший способ выразить это может быть
Если выражение является prvalue, результатом объекта выражение инициализируется непосредственно этим выражением.
Как вы говорите, объекты больше не возвращаются и не передаются с помощью prvalues.
В цитируемом тексте указывается, что существует объект, значение которого установлено на возвращаемое значение функции: с гарантированным исключением C ++ 17 при возврате по значению, этот объект будет чем-то похожим на переменную, создаваемую вызывающей стороной, элементом в векторе, который вызывающая сторона тоже использует или push_backing, или объектом, создаваемым в некоторой динамически распределенной памяти, организованной вызывающей стороной. Вы путаете это с временным, который, как вы говорите, не может быть вовлечен.
Работая систематически, вы цитируете высказывание cppreference о …
return expression;
…тот…
Если выражение является значением, объект, возвращаемый функцией, инициализируется непосредственно этим выражением. Это не требует копирования или перемещения конструктора, когда типы совпадают
Стандарт C ++ 17 говорит в [basic.lval]:
результат из
prvalue
это значение, которое выражение хранит в своем контексте. […] объект результата изprvalue
это объект, инициализированныйprvalue
;prvalue
используется для вычисления значения операнда оператора или имеет тип резюмеvoid
не имеет объекта результата. [ Заметка: Кроме случаев, когдаprvalue
операнд decltype спецификатор,prvalue
класса или типа массива всегда имеет объект результата. Для выброшенногоprvalue
временный объект материализован; …
Итак, в тексте cppreference, что стандартные термины «объект результата«упоминается как «объект, возвращаемый функцией». Язык немного неточен, говоря, что результирующий объект «возвращается», а не «инициализирован», но в целом он не вводит в заблуждение и — поскольку он избежал еще одного кусочка терминологии — может быть проще для понимания большинством читателей cppreference. Я не активно связан с сайтом, но как обычный пользователь у меня сложилось впечатление, что cppreference пытается точно объяснить суть стандарта, но упрощает язык, когда это возможно.
Хотя базовые механизмы не определены Стандартом — а практические аспекты оптимизации / ABI диктуют другую реализацию — чтобы получить представление о том, что Стандарт требует функционально, он может быть помогите представить компилятор, реализующий код вроде …
My_Object function() { return { a, b, c }; }
...
... {
My_Object my_object = function(); // caller
}
…тайно передавая адрес памяти для возвращаемого объекта функции (очень похоже на this
указатель на функции-члены) …
void function(My_Object* p_returned_object) {
new (p_returned_object) My_Object{ a, b, c };
}
Таким образом, существует объект, задействованный и созданный вызываемой функцией, но его местонахождение исключается, то есть адрес памяти, указанный вызывающим абонентом. Если результат вызова функции не используется вызывающей стороной, временный объект, по крайней мере, условно создается, а затем уничтожается.