Являются ли временные объекты значениями x? - PullRequest
7 голосов
/ 12 марта 2012

В настоящее время я пишу дипломную работу, и она также включает в себя некоторое объяснение теории, лежащей в основе C ++ 11, что действительно хорошо, так как C ++ - мой предпочтительный язык программирования, и стандарт более или менее доступен бесплатно (N3337) дляокунитесь в себя.

И все же я врезался в стену, пытаясь точно и подробно объяснить новую категорию xvalue. Насколько я понимаю, временный объект всегда является xvalue, но я не могу найти ссылку на это в стандарте. Насколько я понимаю, категория значений выражения вызова функции для функции, которая имеетвозвращаемый тип без ссылки, это xvalue.Стандарт говорит, что «xvalue - это результат определенного вида выражений, которые включают в себя rvalue-ссылки», что вызывает у меня проблемы.Например:

TestClass { ... };
testClass createObject() { return testClass(); }

void someFunction(TestClass& testClass) { ... }
void someFunction(TestClass&& testClass) { ... }

someFunction(createObject());

Вышеуказанное, как и ожидалось, вызовет перегруженную функцию, которая принимает ссылку-значение в качестве параметра.Однако createObject () не возвращает ссылку на rvalue, он возвращает временный объект типа TestClass.Моя проблема сейчас, я должен объяснить причины этого.Что оценивает выражение «createObject ()»?Если это действительно значение xvalue, потому что оно возвращает временный объект, его причина ясна, а ссылка на rvalue предпочтительна при разрешении перегрузки.Если это не так, каково объяснение этого поведения в отношении стандарта?Есть ли какая-то неявная логика преобразования, определенная где-то, которую я еще не нашел?

Я был бы очень признателен, если бы кто-нибудь мог мне помочь с этим, потому что даже после нескольких дней копания и чтения я еще не пришелсо звуковым объяснением.Заранее большое спасибо.

1 Ответ

11 голосов
/ 12 марта 2012

Объекты никогда не являются значениями {l | r | x}. категории значений описывают выражения .

xvalue - это категория значений выражения вызова функции, где тип возвращаемого значения функции - это rvalue-ссылка на объект (например, std::move), а также категория значения выражения приведения приведение к rvalue ссылке на объект (например, кишки std::move).

Выражение вызова функции createObject() в вашем примере является выражением prvalue , потому что это вызов функции с типом возвращаемого значения без ссылки.

...