我刚刚尝试使用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是错误的。
答案 0 :(得分:13)
根据clang的status page,N3652 Relaxing requirements on constexpr functions已部分实施。本文发生了很大的变化。以下段落已被删除。
非静态成员函数的constexpr说明符,它不是 构造函数声明该成员函数为const(9.3.1)。
此更改意味着无法再在const
个对象上调用您的函数。另请参阅Fixing constexpr member functions without const,这是修复图书馆区域的提案。