【发布时间】:2014-12-11 08:30:39
【问题描述】:
我不知道,为什么 gcc 会编译这段代码
#include <type_traits>
template<class Type, class ValueT>
class ImplAdd
{
template<typename T>
friend typename std::enable_if<std::is_same<T, ValueT>::value, Type>::type
operator+(T, T)
{
return Type{};
}
};
enum class FooValueT { ONE, ZERO };
class Foo : ImplAdd<Foo, FooValueT>
{
public:
Foo() {}
Foo(FooValueT) {}
};
struct A {};
int main()
{
Foo f = FooValueT::ONE + FooValueT::ZERO;
}
clang 和 msvc 无法编译,在我看来,它们是正确的。它是 GCC 编译器中的错误吗? gcc的版本是4.8.2。
问题是由我的回答引起的:In-class friend operator doesn't seem to participate in overload resolution,答案中有引用标准,指出这样的定义应该在类范围内,如果函数不是模板 - gcc 拒绝这个代码,那是对的。感谢您的回答,以及证明 gcc 正确(或不正确)的标准引用。
【问题讨论】:
标签: c++ c++11 gcc language-lawyer