如何在其聚合初始化程序中使用类静态对象的大小?

时间:2019-07-18 22:33:11

标签: c++ sizeof static-variables aggregate-initialization

在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;
}

0 个答案:

没有答案