Есть ли у временных объектов идентичность?

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

object.temporary_object().modify()

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

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

может быть, чтобы лучше понять идентичность: stackoverflow.com/questions/50783525/…
geza 13.09.2018 19:08

@geza Спасибо, этот ответ помог мне лучше понять связь xvalue-identity

Nazinho 13.09.2018 20:31

@downvoters, ты можешь объяснить -1? Мне этот вопрос кажется вполне разумным.

Nazinho 13.09.2018 20:32
0
3
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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.

Ответ принят как подходящий

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

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

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

Касательно и забавно для меня, вы можете создать тип C++, который ведет себя как выражение prvalue, но сам может рассматриваться как объект, отдельный от того, что он создает: template<class F>struct prvalue{ F f; operator std::invoke_result_t<F>()&&{ return f(); } };

Yakk - Adam Nevraumont 13.09.2018 20:28

Другие вопросы по теме