结构成员

时间:2015-10-22 00:00:57

标签: c++11 visual-c++ visual-studio-2015

这是我的测试用例,简化为最小测试用例:

#include <iostream>
struct Foo {
    int i;
    static_assert(sizeof(i) > 1, "Wrong size");
};
static_assert(sizeof(Foo::i) > 1, "Wrong size");
int main () {
    Foo f{42};
    static_assert(sizeof(f.i) > 1, "Wrong size");
    std::cout << f.i << "\n";
}

这适用于任何版本的GCC或Clang,足以支持static_assert。但是在MSVC 2015上,第一个static_assert给了我一个编译错误:

static-assert.cpp(4): error C2327: 'Foo::i': is not a type name, static, or enumerator
static-assert.cpp(4): error C2065: 'i': undeclared identifier
static-assert.cpp(4): error C2338: Wrong size

如果删除第一个断言,另外两个断言按预期工作。我也在VS2013上尝试了相同的结果。 documentation for C2327讨论了嵌套的类成员访问,这看起来并不像我能看到的任何方式。这里发生了什么?哪个编译器是对的?

(编辑添加第三个断言以使问题更清楚。)

进一步编辑:它实际上似乎与static_assert无关,因为它失败并出现同样的错误:

struct Foo {
    int i;
    char array[sizeof(i)];
};

同样,这在其他编译器中也可以正常工作。

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题,问题是MSVC 2013不支持常量表达式,因此

static_assert(sizeof(i) > 1, "Wrong size");

char array[sizeof(i)];

需要编译器不支持的常量表达式。

这在gcc中有效

答案 1 :(得分:0)

有趣的是,sizeof (decltype(i))适用于VS2013。