我使用以下代码在gcc(v4.9.2)中收到'sizeof (((A*)0)->A::m_i)' is not a constant expression
错误消息。
任何人都可以解释为什么会这样吗?
头文件:a.h
struct A {
int m_i;
static constexpr
size_t size() { return sizeof(m_i); } // no error if returns sizeof(decltype(m_i))
};
头文件:b.h
#include "a.h"
template<typename T>
struct B {
static constexpr size_t size_of_A = A::size();
};
源文件:main.cpp
#include "b.h" // <-- Triggers the error(all else the same)
int main() {
return 0;
}
错误随着以下任何修改而消失:
#include
中的main.cpp
指令已被删除
struct B
已更改为非模板
A::size()
被修改为return sizeof(decltype(m_i));
P.S。针对收到的有关该帖子的一些意见,请注意:
a)代码必须在指示的不同文件中进行布局,以重现错误。
b)代码不在任何地方都包含((A*)0)->A::m_i
表达式。
答案 0 :(得分:0)
问题似乎来自gcc版本。更新到5.1.0解决了这个问题。