Стандарт C ++ (4/5) преобразование lvalue-to-rvalue не выполняется для операнда унарного оператора &.
Эта цитата только для того, чтобы вас запутать. Другой цели у него нет. ;)
Самая важная цитата (цитируется N3242, поэтому новая терминология имеет prvalue вместо rvalue):
Всякий раз, когда выражение glvalue появляется как операнд оператора, который ожидает prvalue для этого операнда, стандартные преобразования lvalue-to-rvalue (4.1), массива в указатель (4.2) или функции в указатель (4.3) применяется для преобразования выражения в prvalue.
Таким образом, язык можно описать в терминах конструкций, которые ожидают prvalue, и конструкций, которые этого не делают. В частности, оператор &
не ожидает prvalue (как раз наоборот), поэтому неявное преобразование lvalue-to-rvalue не требуется и не будет применяться.
Стандартное описание непоследовательно: в нем никогда явно не говорится, что в x += y
неявное преобразование lvalue-to-rvalue не применяется к x
, предположительно потому, что это чрезвычайно очевидно. Почему авторы сочли необходимым прямо сказать, что для &x
, где это так же очевидно, мне непонятно.
Я думаю, что эти упоминания о том, что неявные преобразования не применяются, следует удалить. Стандарт описывает то, что происходит, а не (бесконечно много) вещей, которых не происходит (если только это не вызывает особого удивления).
Неявные преобразования применяются только для корректировки характера выражения в соответствии с ожидаемым контекстом (контекст может быть выражением, оператором, объявлением, ctor-init-list ...).
Что насчет этого?
int &r = x;
Я уверен, что в этом заявлении не будет конверсии,
потому что здесь не требуется никакого неявного преобразования. Неявное преобразование применяется только при необходимости. Ссылочная привязка не ожидает rvalue.
но я не понимаю, как в этом участвует оператор &?
Нет.
person
curiousguy
schedule
25.12.2011