静态类成员的顺序
The order of static class members
今天我发现静态类成员的顺序实际上很重要。下面是示例:
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>
他应该如何有意义地推断出你的实际意思时?
相关文章:
- 在循环中按顺序遍历成员变量
- C++成员的析构函数顺序与shared_ptr
- 按类成员的顺序对包含类对象的C++向量进行排序
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 用作成员构造函数参数的函数的求值顺序
- 成员初始值设定项的顺序
- 内联初始化的静态 const 类成员的初始化顺序保证
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 共享库中静态功能成员的破坏顺序
- C++11 成员类初始化顺序
- 静态内联成员初始化顺序
- 更改 std::set 作为成员属性的顺序
- 位成员顺序相反?
- C++中的类私有成员的内存顺序是否得到保证?
- 静态成员的静态阵列:初始化顺序惨败的可能性
- C++-销毁顺序-函数的静态成员在主类析构函数之前被销毁
- 为什么在定义静态成员变量时不遵循定义顺序
- 如何维护类成员的顺序,并且仍然有一个可工作的构造函数
- 编译时随机化结构成员的顺序
- 类模板中成员变量的顺序