【发布时间】:2014-07-12 00:16:02
【问题描述】:
给定以下代码:
#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;
}
使用 GCC 4.8.1、4.9 和 clang 3.4 编译时不会发出警告,但会给出不同的结果。
$ 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
造成这种差异的原因是什么?如何强制执行相同的行为?
编辑: 有趣的事实:从成员函数中删除 const 限定符使 gcc 也更喜欢成员函数。然而,它并没有解决问题。
编辑:如果未指定-std=c++11,则clang++ 更喜欢非成员。
编辑: ICC 14.0 更喜欢非会员,不会发出警告。
【问题讨论】:
标签: c++ gcc clang language-lawyer