lvalue в rvalue неявное преобразование

Я вижу терминпреобразование lvalue в rvalue " используется во многих местах по всему стандарту C ++. Насколько я могу судить, такое преобразование часто выполняется неявно.

Одна неожиданная (для меня) особенность формулировки из стандарта состоит в том, что они решают рассматривать lvalue-to-rvalue как преобразование. Что если бы они сказали, что glvalue всегда приемлемо вместо prvalue. Будет ли эта фраза иметь другое значение? Например, мы читаем, что lvalues и xvalues являются примерами glvalues. Мы неНе читайте, что lvalues и xvalues конвертируемы в glvalues. Есть ли разница в значении?

Перед моим первым знакомством с этой терминологией я обычно мысленно моделировал lvalues и rvalues следующим образом: "Значениявсегда может выступать в качестве значения, но в дополнение может появиться на левой стороне=и справа от ".&

Для меня это интуитивное поведение: если у меня есть имя переменной, я могу поместить это имя везде, где я бы поместил литерал. Эта модель, по-видимому, согласуется с терминологией неявных преобразований lvalue-to-rvalue, используемой в стандарте, при условии, что это неявное преобразование гарантированно произойдет.

Но, поскольку они используют эту терминологию, я начал задаваться вопросом, может ли в некоторых случаях произойти неявное преобразование lvalue в rvalue. То есть, возможно, моя ментальная модель здесь неверна. Вот соответствующая часть стандарта: (спасибо комментаторам).

Всякий раз, когда glvalue появляется в контексте, где ожидается prvalue, glvalue преобразуется в prvalue; см. 4.1, 4.2 и 4.3. [Примечание: попытка связать ссылку на rvalue с lvalue не является таким контекстом; см. 8.5.3 .—конечная нота]

Я понимаю, что они описывают в примечании следующее:

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-в-значение не происходят неявно?

2) Также в скобках[Note:...] в предложении создается впечатление, что мы могли бы понять это из предложения раньше. Какая часть стандарта это будет?

3) Означает ли это, что привязка rvalue-reference не является контекстом, в котором мы ожидаем выражение prvalue (справа)?

4) Как и в случае других преобразований, включает ли преобразование glvalue в prvalue работу во время выполнения, которая позволила бы мне наблюдать это?

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

Хороший ответ - пройти цитату, которую я поместил выше, и объяснить (основываясь на анализе текста), является ли примечание в нем также неявным из его текста. Затем он может добавить любые другие цитаты, которые позволят мне узнать другие контексты, в которых это преобразование может не произойти неявно, или объяснить, что таких контекстов больше нет. Возможно общее обсуждение того, почему glvalue в prvalue считается преобразованием.

Ответы на вопрос(2)

Ваш ответ на вопрос