静态constexpr方法实现导致gcc bug?

时间:2011-10-09 00:44:29

标签: c++ c++11 gcc4 constexpr

这是一段代码:

class Class
{
    static constexpr int getBug();
};

constexpr int Class::getBug()
{
    return 0;
}

我基本上做的是在类声明中声明static constepxr方法,然后实现它。

原始代码分为两个文件,并包含更多已被剥离的方法/属性,只留下所需的代码。

当我编译代码时,我从GCC 4.6.0中得到以下错误:

Class.cpp:6:29: internal compiler error: in merge_types, at cp/typeck.c:825
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
  1. 这真的是个错误吗?

  2. 在这种情况下,我必须提供哪些报告?


  3. 我在online C++0x compiler上测试了代码并收到以下错误:

    prog.cpp:3:33: error: the 'constexpr' specifier cannot be used in a function declaration that is not a definition
    prog.cpp:6:29: error: a constexpr function cannot be defined outside of its class
    

    此编译器使用GCC 4.5.1。 它让我知道我的代码格式不正确,但引入了更多问题:

    1. 为什么GCC 4.5.1会出错并且GCC 4.6.0报告错误?

    2. 在写完最后一段之后,我在GCC 4.6.0上测试了剥离static关键字并且单独的实现编译没有任何警告!

      1. 为什么同一家庭的两个编译器 表现得如此不同?
      2. 我知道constexpr方法应避免使用与return不同的任何语句,这可能解释了GCC 4.5.1错误报告。 由于我的方法使用宏条件来返回良好(常量)值,因此需要几行来解释为什么我要使用单独的实现(除了通常的建议)。


        我的配置:

        Mac OS X.7
        GCC 4.6.0
        Target: x86_64-apple-darwin10.7.0
        Configured with: ./configure
        COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.7.0' '-v' '-save-temps' '-std=c++0x' '-c' '-shared-libgcc' '-mtune=core2'
        

1 个答案:

答案 0 :(得分:5)

这是因为constexpr是该语言的新功能,根据C++0x Support in GCC页面,此功能的支持首次添加到4.6中的GCC。我怀疑它实际上是编译器中的一个错误,可以在4.6.1或更高版本中修复。

GCC 4.5.2生成错误,因为该版本中尚未提供该功能。实际上,如果你要查看4.5.2的标准库头文件,你会发现所有constexpr方法(按标准规定)都说'需要constexpr'。