27 votes

Comportement différent du compilateur lors de l'application d'un qualificatif const à un argument de modèle

Considérons l'exemple suivant (godbolt):

#include <iostream>

template <typename T>
const T *as_const(T *p) { return p; }

void f() {}

template <typename T>
void g(T *) { std::cout << "A"; }

template <typename T>
void g(const T *) { std::cout << "B"; }

int main() {
  g(as_const(&f));
}

GCC et Clang pouvez le compiler, mais le résultat de produire des exécutables de sortie différents: la version compilée avec GCC imprime A et celui compilé avec Clang imprime B.

Pourriez-vous expliquer cette différence?

Mise à jour: comme l'a souligné @VTT la même différence est observée, même si as_const est supprimée.

17voto

Baum mit Augen Points 3571

Il semble que vous a frappé un défaut dans le standard qui doit encore être résolue. Donc la réponse à "Qui est un compilateur droit?" serait pas tout à fait clair à l'heure actuelle.

La question a été soulevée et discutée par le comité:

Il n'est pas clair si la suite est bien formé ou pas:

void foo(){}

template<class T>
void deduce(const T*) { }

int main() {
  deduce(foo);
}

Les implémentations varient dans leur traitement de cet exemple.

voir http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584mais la proposition de résolution ne fait pas partie de N4141 ou N4659.

Notez que vous ne pouvez généralement pas avoir des pointeurs vers const des types de fonction; si vous considérez l'exemple que j'ai cité mal formé, gcc serait correct. Il rejette l'exemple et, dans l'OP, choisit la non-const version la seule viable de surcharge.

Si clang (qui prétend mettre en œuvre la résolution proposée) serait bon sinon, je ne suis pas sûr. Je suppose que nous aurions à revisiter cette discussion une fois que le comité a résolu le problème avec certains normatif libellé que nous pouvons utiliser.

Cependant,

Le consensus de GTC a été que le cv-la qualification de l'argument et de paramètre doit correspondre, ainsi l'exemple d'origine, doit être rejetée.

(note à ce sujet) semble indiquer que gcc est à droite et le problème sera résolu en faveur de son comportement.

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