在Win32标准库中,使结构的第一个成员成为结构的大小是一个相当普遍的习惯用法,如下所示:
#include <cstddef>
struct wrapped_float
{
std::size_t value; //Initialize with sizeof(wrapped_float)
float other; //Actual info
};
如果我创建一个全局对象,那么有一个简单的初始化语法可以自动适应a
类型的变化:
constexpr wrapped_float const a{ sizeof(a), 0 }; //OK
我希望我的对象不是结构的静态成员,而不是创建全局对象:
struct test1 {
static constexpr wrapped_float const b{ sizeof(b), 0 }; //Error!
};
但是MSVC在此类代码上出错,抱怨b
不是struct test1
的成员。因此,我有两个相关的问题:
1。为什么全局成员和静态成员之间有区别?
2。有解决方法吗?
有问题的类型来自Win32标头,因此我无法从等效的wrapped_float
中添加或删除成员。 (如果有用,我可以使用派生的类/结构。)
的明显变化
struct test2 {
static constexpr wrapped_float const b{ sizeof(test::b), 0 };
};
和
struct test3 {
static constexpr wrapped_float const b{ sizeof(decltype(b)), 0 };
};
产生相同的结果。我已经在godbolt上进行了验证,该现象也不取决于我是否使用MSVC进行编译,唯一适用于x86-64 Clang的编译器。要得出M(非)WE,写
int main() {
return a.value + test1::b.value + test2::b.value + test3::b.value;
}