我遇到了代码无法为我正在使用的外部库编译的问题。我相信库可以用gcc编译好,但是无法用clang为我编译。
我可以重新创建如下问题
template <class T>
class A {
public:
struct B {
int a;
};
void test();
private:
T _t;
};
template <class T>
void A<T>::test()
{
printf("Result %d", std::numeric_limits<decltype(B::a)>::max());
}
int main(int argc, char** argv)
{
auto t = A<int>();
t.test();
return 0;
}
无法在clang上编译并出现以下错误
error: invalid use of non-static data member 'a' printf("Result %d", std::numeric_limits<decltype(B::a)>::max());
我的问题如下:
预期的行为是什么?
在c ++ 11中添加了非静态成员的decltype。这适用于模板类中声明的那些吗?
这是编译错误吗?或者使用gcc的不符合代码的示例?
答案 0 :(得分:10)
这是旧版Clang中的一个错误,并在Clang 3.9.0中修复: https://godbolt.org/g/zqFxL2
规范标准:
8.2.3:在某些情况下,会出现未评估的操作数([expr.prim.req], [expr.typeid],[expr.sizeof],[expr.unary.noexcept], [dcl.type.simple] ,[temp])。未评估未评估的操作数。 [注意:在未评估的操作数中,非静态类成员可能是 named([expr.prim])和对象或函数的命名不是 本身,要求提供定义([basic.def.odr])。一个 未评估的操作数被视为完整表达。 - 结束说明]