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