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.