Я вижу термин "преобразование lvalue-to-rvalue", используемый во многих местах по всему стандарту С++. Насколько я могу сказать, такое преобразование часто делается неявно.
Одна неожиданная (мне) особенность формулировки из стандарта заключается в том, что они решают рассматривать значение lvalue-to-rvalue как преобразование. Что, если бы они сказали, что значение glvalue всегда приемлемо, а не prvalue. Будет ли эта фраза иметь другой смысл? Например, мы читаем, что lvalues и xvalues являются примерами glvalues. Мы не читаем, что lvalues и xvalues преобразуются в glvalues. Есть ли разница в значении?
До того, как я впервые столкнулся с этой терминологией, я более или менее моделировал lvalues и rvalues следующим образом: "lvalues всегда могут действовать как rvalues, но, кроме того, могут появляться в левой части =
, и справа от &
".
Это для меня интуитивное поведение, что, если у меня есть имя переменной, я могу разместить это имя везде, где я бы поставил литерал. Эта модель, по-видимому, согласуется с терминологией неявных преобразований lvalue-to-rval, используемой в стандарте, если это неявное преобразование гарантировано.
Но, поскольку они используют эту терминологию, я начал задаваться вопросом, может ли неявное преобразование lvalue-rvalue в некоторых случаях не произойти. То есть, возможно, моя ментальная модель здесь не так. Вот соответствующая часть стандарта: (спасибо комментаторам).
Всякий раз, когда glvalue появляется в контексте, где ожидается значение prvalue, glvalue преобразуется в prvalue; см. 4.1, 4.2 и 4.3. [Примечание: попытка привязки ссылки rvalue к lvalue не является таким контекстом; см. 8.5.3.-end note]
Я понимаю, что они описывают в примечании, следующее:
int x = 1;
int && y = x; //in this declaration context, x won't bind to y.
// but the literal 1 would have bound, so this is one context where the implicit
// lvalue to rvalue conversion did not happen.
// The expression on right is an lvalue. if it had been a prvalue, it would have bound.
// Therefore, the lvalue to prvalue conversion did not happen (which is good).
Итак, мой вопрос (есть):
1) Может ли кто-нибудь прояснить контексты, где это преобразование может произойти неявно? В частности, кроме контекста привязки к ссылке rvalue, есть ли другие, где преобразования lvalue-rvalue не могут выполняться неявно?
2) Кроме того, в скобках [Note:...]
в предложении кажется, что мы могли бы понять это из предложения раньше. Какая часть стандарта была бы такой?
3) Означает ли это, что привязка ссылки на rvalue не является контекстом, где мы ожидаем выражения prvalue (справа)?
4) Как и в других преобразованиях, преобразование glvalue-to-prvalue включает работу во время выполнения, что позволило бы мне это наблюдать?
Моя цель здесь не в том, чтобы спросить, желательно ли разрешить такое преобразование. Я пытаюсь научиться объяснять себе поведение этого кода с использованием стандарта в качестве отправной точки.
Хороший ответ будет проходить через цитату, которую я поставил выше, и объясню (на основе анализа текста), является ли заметка в ней также неявной из ее текста. Тогда он может добавить любые другие кавычки, которые позволят мне узнать другие контексты, в которых это преобразование может не произойти неявно или объяснить, что таких контекстов больше нет. Возможно, общее обсуждение того, почему glvalue to prvalue считается конверсией.