Selon [expr.cast]/4, une distribution de style C tente les distributions suivantes dans l'ordre:
const_cast
static_cast
static_cast
suivi de const_cast
reinterpret_cast
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?
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.