Вопрос

Мне потребовалось довольно много времени, чтобы понять разницу между значением rvalue и временным объектом.Но теперь в окончательном проекте комитета говорится на странице 75:

Ан значение rv [...] является значение xvalue, временный объект или его подобъект, или значение, которое не связано с объектом.

Я не могу поверить своим глазам.Это, должно быть, ошибка, верно?


Чтобы пояснить, вот как я понимаю эти термины:

#include <string>

void foo(std::string&& str)
{
    std::cout << str << std::endl;
}

int main()
{
    foo(std::string("hello"));
}

В этой программе есть два выражения которые обозначают одно и то же временный объект:значение prvalue std::string("hello") и конечное значение str.Выражения не являются объектами, но их вычисление может привести к одному из них.В частности, оценка prvalue дает временный объект, но prvalue НЕ ЯВЛЯЕТСЯ временным объектом.Кто-нибудь согласен со мной, или я сошел с ума?:)

Это было полезно?

Решение

Да, я согласен с тобой. Это должно быть исправлено на мой взгляд, и несколько человек, которые я глубоко уважаю, чтобы выросли точно такой же вопрос об этом.

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

Это не так сложно, как кажется.Я имею в виду завершенный в настоящее время стандарт ISO/IEC 14882-2011.На странице 78 написано:

В тихую (с “истекающим сроком годности” ценностью) также относится к объекту, обычно вблизи в конце срока службы (так что его ресурсы могут быть перемещены, для пример). xvalue является результатом определенных типов выражений включающих ссылки на rvalue (8.3.2).

Выделенное жирным шрифтом выше было добавлено мной.Далее в стандарте говорится:

Значение rvalue (так называемый, исторически, ведь правосторонние значения могут отображаться на в правой части выражения присваивания) является увеличение в временный объект (12.2) или их составляющих, или значение, которое не связанные с объектом.

Таким образом, вы получаете xvalue только тогда, когда играете с "определенными видами выражений, включающими ссылки на rvalue".В противном случае ваши временные объекты - это просто временные объекты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top