Étant donné le code suivant:
#include <iostream>
struct Alice
{
template <typename A>
void operator|(const A& /*a*/) const
{
std::cout << "operator| member" << std::endl;
}
};
template <typename A>
void operator|(const A& /*a*/, const Alice& /*alice*/)
{
std::cout << "operator| non-member" << std::endl;
}
int main()
{
Alice a;
Alice b;
a | b;
return 0;
}
Il se compile sans warning avec GCC 4.8.1, 4.9 et clang 3.4, mais donne des résultats différents.
$ g++ -Wall -Wextra -std=c++11 alice.cpp && ./a.out
operator| non-member
$ clang++ -Wall -Wextra -std=c++11 alice.cpp && ./a.out
operator| member
Quelles sont les causes de cette différence? Comment puis-je forcer le même comportement?
EDIT: fait Intéressant: la suppression de l' const
qualifier à partir de la fonction de membre de fait de gcc préfèrent la fonction de membre également. Elle ne résout pas le problème, cependant.
EDIT: clang++ préfère les non-membres au lieu de cela, si -std=c++11
n'est pas spécifié.
EDIT: ICC 14.0 préfère la non-membre, pas d'avertissement émis.