在模板类中声明的struct成员失败

decltype fails on struct member declared in template class

本文关键字:struct 成员 失败 声明      更新时间:2023-10-16

我对我正在使用的外部库未编译的代码有一个问题。我相信图书馆可以通过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中添加了非静态成员的声明。这适用于模板类中声明的人吗?

  • 这是编译器错误吗?或使用GCC?

  • 的不合格代码的示例

它是旧版本的错误,并将其固定在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](。未评估未评估的操作数。 [注意:在未评估的操作数中,非静态类成员可能是 命名([Expr.prim](和对象或函数的命名,不是通过 本身,要求提供一个定义([BASIC.DEF.ODR](。一个 未评估的操作数被认为是全表达。 - 终注]