C ++ constexpr函数在模板中不被识别

时间:2018-03-18 13:41:12

标签: c++ templates constexpr

我使用以下代码在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表达式。

1 个答案:

答案 0 :(得分:0)

问题似乎来自gcc版本。更新到5.1.0解决了这个问题。