Почему (int&)0 плохо сформировано?
Согласно [expr.cast]/4, бросок в стиле C пытается выполнить следующие приведенные ниже броски:
const_cast
static_cast
static_cast
с последующимconst_cast
reinterpret_cast
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.