clang 3.3和GCC 4.7 const v的constexpr

时间:2013-06-21 22:06:41

标签: c++ c++11 const constexpr c++14

我刚刚尝试使用clang 3.3和Ubuntu 13.04上的GCC 4.7.3标准库头文件编译相当大的代码。除了一个问题外,一切顺利。这段代码已经在这台机器上编译了标准的Ubuntu clang 3.2软件包,所以我假设这是clang 3.3编译器的一些变化。与使用复杂标头的const和constexpr相关的问题。特别是复杂类型具有以下代码块

#ifdef __GXX_EXPERIMENTAL_CXX0X__
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // DR 387. std::complex over-encapsulated.
      constexpr double
      real() { return __real__ _M_value; }

      constexpr double
      imag() { return __imag__ _M_value; }
#else
      double&
      real() { return __real__ _M_value; }

      const double&
      real() const { return __real__ _M_value; }

      double&
      imag() { return __imag__ _M_value; }

      const double&
      imag() const { return __imag__ _M_value; }
#endif

在我的编译中,我输入第一个代码块,因此编译器会看到

constexpr double real() { return __real__ _M_value; }

这导致clang产生错误,实际成员函数不是const,具有以下

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/complex:1212:7: 
note: candidate function not viable: 'this' argument has type 'const complex<double>',
      but method is not marked const

      real() { return __real__ _M_value; }

我已经阅读了以下帖子Difference between `constexpr` and `const`以及其他一些类似的文档,但如果这是GCC头问题或clang编译器问题,我仍然不太清楚。我的感觉是标记constexpr的成员函数应该被编译器视为const,在这种情况下clang是错误的。

1 个答案:

答案 0 :(得分:13)

根据clang的status pageN3652 Relaxing requirements on constexpr functions已部分实施。本文发生了很大的变化。以下段落已被删除。

  

非静态成员函数的constexpr说明符,它不是   构造函数声明该成员函数为const(9.3.1)。

此更改意味着无法再在const个对象上调用您的函数。另请参阅Fixing constexpr member functions without const,这是修复图书馆区域的提案。