Почему (int&)0 плохо сформировано?

Согласно [expr.cast]/4, бросок в стиле C пытается выполнить следующие приведенные ниже броски:

  1. const_cast
  2. static_cast
  3. static_cast с последующим const_cast
  4. reinterpret_cast
  5. reinterpret_cast с последующим const_cast

Следующий состав хорошо сформирован:

const_cast<int&>(static_cast<const int&>(0))

И все же и GCC, и Clang отклоняют актерский состав (int&)0, Зачем?

3 ответа

Это ошибка в gcc и clang .

Согласно CWG 909, при создании последовательностей приведения для приведения в стиле C следует использовать "прямую интерпретацию формулировки"; там первое приведение вызывает оператор преобразования, но нет причин думать, что должно быть иначе, когда первое приведение является ссылкой, связывающей временную.

Я отправил патч в список рассылки gcc, созданный из этой ветки git , но до сих пор он не получил никакого внимания.

Причина того, что приведение (int&)0 отклонено, заключается в том, что вы пытаетесь привести литерал в качестве ссылки, которая на самом деле не имеет смысла. Оператор & ожидает ссылочное значение, и вы не можете ссылаться на литерал. Компилятор видит, что вы приводите литерал как значение main.cpp:2:11: error: invalid cast of an rvalue expression of type 'int' to type 'int&'

Этот вопрос на самом деле не сводится к иерархии приведений, а к невозможности приводить литералы в качестве ссылок.

Изменить: Быстрое примечание, я немного смущен вашей формулировкой, является const_cast<int&>(static_cast<const int&>(0)); принят компилятором? Это не должно происходить из-за использования lvalue в качестве rvalue. Если так, я, должно быть, неправильно понял вопрос, и я отклоню свой ответ.

Почему?

Это просто потому, что неконстантные ссылки lvalue не могут быть привязаны к prvalue.

Другие вопросы по тегам