Временные объекты имеют идентичность? - PullRequest
0 голосов
/ 13 сентября 2018

Я спрашивал себя, есть ли у Временные объекты идентичность .Я знаю, что допустимо следующее:

object.temporary_object().modify()

, поскольку возвращаемый объект не является константным или функция, вызываемая для этого объекта, не изменяет неизменяемые члены.

Согласно определение категорий значений , prvalue s результаты могут быть перемещены , но не имеют идентификаторов, и поскольку временные объекты являются результатом выражений prvalue, как их можно изменить?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Связанный документ не является нормативным.В некотором смысле это, кажется, описывает, какими должны быть ценности, а не то, что они были в то время.В C ++ 17 стало верно, что prvalues ​​не имеют идентичности - но в C ++ 11 и C ++ 14 это было не совсем так.

В C ++ 11 и C ++14, значение типа имеет идентификатор, потому что, как вы заметили, можно вызывать метод для него, а также есть способы наблюдать его адрес.Аналогично, значения типа массива имеют идентичность.Значения скалярного типа ( например, целочисленные литералы) не имеют идентичности.Привязка их к ссылкам вызовет материализацию временного объекта, который теперь имеет адрес, но больше не наблюдается как prvalue.

В C ++ 17 prvalues ​​не имеют идентичности и не являются временными объектами,но вместо этого это выражения, которые можно использовать для создания временных (или не временных) объектов.Переход от значения к объекту эффективно «вызывает» значение.Временный объект можно наблюдать только как xvalue.

0 голосов
/ 13 сентября 2018

Вы можете изменить временный объект, как и любой другой.Изменения будут просто спорными, так как они будут выброшены, когда закончится срок службы временного объекта и он будет разрушен.

Это похоже на что-то вроде этого:

SomeClass object;
// Some code...

{
    // Entering a new scope, the life-time of variables in here ends when the scope ends
    SomeOtherClass temporary_object = object.temporary_object();

    temporary_object.modify();

    // Now the scope ends, and the life-time of temporary_object with it
}

// Here there exists no such things as "temporary_object"

Все изменения, сделанные вами в temporary_objects, будут потеряны, когда закончится вложенная область, и будет уничтожено temporary_object.


Один важный отказ от ответственности: вы можете создать SomeOtherClass (из приведенного выше примера)сохранить ссылку (ссылку или указатель) на object, и функция modify() может использовать эту ссылку для изменения самого object. Эти модификации будут существовать и после разрушения temporary_object, поскольку они являются модификацией самого object вместо temporary_object.

...