значения r и временные объекты в FCD
Вопрос
Мне потребовалось довольно много времени, чтобы понять разницу между значением 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".В противном случае ваши временные объекты - это просто временные объекты.