静态类成员的顺序

The order of static class members

本文关键字:顺序 成员 静态类      更新时间:2023-10-16

今天我发现静态类成员的顺序实际上很重要。下面是示例:

template <typename T>
struct SizeOf
{
    template <typename U>
    static auto Test() { return U{}; }
    static const size_t value = sizeof(Test<T>());
};
std::cout << SizeOf<double>::value << std::endl; // ok!

但是,这种情况给了我编译器错误:

template <typename T>
struct SizeOf
{
    static const size_t value = sizeof(Test<T>());
    template <typename U>
    static auto Test() { return U{}; }
};
std::cout << SizeOf<double>::value << std::endl; // error: "Test: undeclared identifier"

这是否意味着静态成员被视为与全局变量/函数完全相同,因此不会被后面出现的静态成员看到?

这与编译器知道名称的顺序有关。 当你有

template <typename T>
struct SizeOf
{
    static const size_t value = sizeof(Test<T>());
    template <typename U>
    static auto Test() { return U{}; }
};

编译器从未见过Test static const size_t value = sizeof(Test<T>());所以它抛出

测试:未声明的标识符

因为它不知道它是什么。 当你反过来使用它时,编译器知道Test是什么,所以它可以很好地编译。

您不能引用尚未声明的内容。当编译器遇到Test<T>他应该如何有意义地推断出你的实际意思时?