27 votes

En C ++, une conversion de style C peut-elle invoquer une fonction de conversion, puis annuler la constance?

GCC et Clang rejettent tous deux le style C cast dans le code suivant.

http://coliru.stacked-crooked.com/a/c6fb8797d9d96a27

struct S {
    typedef const int* P;
    operator P() { return nullptr; }
};
int main() {
    int* p1 = const_cast<int*>(static_cast<const int*>(S{}));
    int* p2 = (int*)(S{});
}
main.cpp: In function 'int main()':
principal.rpc:7:25: erreur: invalid distribution de type 'S' de type 'int*'
 int* p2 = (int*)(S{});
principal.rpc:7:15: erreur: impossible de distribution de type " S " de pointeur de type 'int *'
 int* p2 = (int*)(S{});
^~~~~~~~~~~

Toutefois, selon la norme, un style C cast pouvez effectuer les conversions réalisées par un static_cast suivie par un const_cast. Est-ce code bien formé? Si non, pourquoi pas?

9voto

Columbo Points 11661

C'est la question centrale 909:

Selon 5.4 [expr.distribution] le paragraphe 4, une interprétation possible d'un style ancien en fonte est comme un static_cast suivie par un const_cast. Un serait donc s'attendre à ce que les expressions marquées #1 et #2 dans le exemple suivant, ont la même validité et le sens:

struct S {
  operator const int* ();
};

void f(S& s)  {
  const_cast<int*>(static_cast<const int*>(s));  // #1
  (int*) s;  // #2
}

Cependant, un certain nombre d'implémentations question d'une erreur sur le #2.

Est l'intention de l' (T*)x doit être interprété comme quelque chose comme

const_cast<T*>(static_cast<const volatile T*>(x))

Justification (Juillet 2009):

Selon l'interprétation directe de la formulation, l'exemple devrait fonctionner. Cela semble être juste un bug du compilateur.

Ce fut apparemment jamais résolu par ni Bruit, ni de GCC. De temps à ouvrir des tickets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X