web-dev-qa-db-fra.com

Pourquoi (int &) 0 est-il mal formé?

Selon [expr.cast]/4, une distribution de style C tente les distributions suivantes dans l'ordre:

  1. const_cast
  2. static_cast
  3. static_cast suivi de const_cast
  4. reinterpret_cast
  5. reinterpret_cast suivi de const_cast

Le casting suivant est bien formé:

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

Pourtant, GCC et Clang rejettent la distribution (int&)0. Pourquoi?

23
Brian

Le rejet de la conversion (int &) 0 est dû au fait que vous essayez de définir un littéral comme une référence qui n'a pas vraiment de sens. L'opérateur & attend une valeur pouvant être référencée et vous ne pouvez pas référencer un littéral. Le compilateur voit que vous lancez un littéral sous la forme d'une valeur rvalue d'où main.cpp:2:11: error: invalid cast of an rvalue expression of type 'int' to type 'int&'

Cette question ne vient pas vraiment de la hiérarchie des castes, mais plutôt de l'impossibilité de convertir les littéraux en références.

Edit: note rapide, votre formulation me confond un peu, est-ce que const_cast<int&>(static_cast<const int&>(0)); est accepté par le compilateur? Cela ne devrait pas être dû à la définition d'une valeur comme une valeur. Si c'est le cas, j'ai mal compris la question et je vais récuser ma réponse.

1
Garrigan Stafford