Почему (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. Зачем?

Ответы

Ответ 1

Причина отклонения cast (int &) 0 заключается в том, что вы пытаетесь использовать литерал как ссылку, которая на самом деле не имеет смысла. И оператор ожидает эталон состояния значения, и вы не можете ссылаться на буквальном. Компилятор видит, что вы производите литерал как rvalue, следовательно 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. Если так, то я, должно быть, неправильно понял вопрос, и я откажусь от ответа.