这是我的测试用例,简化为最小测试用例:
#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)];
};
同样,这在其他编译器中也可以正常工作。
答案 0 :(得分:0)
我有一个类似的问题,问题是MSVC 2013不支持常量表达式,因此
static_assert(sizeof(i) > 1, "Wrong size");
和
char array[sizeof(i)];
需要编译器不支持的常量表达式。
这在gcc中有效
答案 1 :(得分:0)
有趣的是,sizeof (decltype(i))
适用于VS2013。