clang ++和libc ++是否支持constexpr数学函数

时间:2014-09-01 19:58:14

标签: math constexpr clang++

我知道g ++支持constexpr数学函数。我想在clang ++上做到这一点。所以我写了一个简单的代码。

#include<iostream>
#include<cmath>

int main()
{
  constexpr auto a(std::floor(4.3));
  std::cout<<a<<std::endl;
}

然后使用clang ++ - libc ++ -std = c ++ 1y编译它并得到以下错误:

error: constexpr variable 'a' must be initialized by a constant expression
constexpr auto a(std::floor(4.3));
             ^ ~~~~~~~~~~~~~~~
note: non-constexpr function 'floor' cannot be used in a constant expression
constexpr auto a(std::floor(4.3));
               ^
/usr/include/x86_64-linux-gnu/bits/mathcalls.h:184:14: note: declared here
__MATHCALLX (floor,, (_Mdouble_ __x), (__const__));
             ^
/usr/include/math.h:58:26: note: expanded from macro '__MATHCALLX'
__MATHDECLX (_Mdouble_,function,suffix, args, attrib)
                       ^
/usr/include/math.h:60:22: note: expanded from macro '__MATHDECLX'
__MATHDECL_1(type, function,suffix, args) __attribute__ (attrib); \
                   ^
/usr/include/math.h:63:31: note: expanded from macro '__MATHDECL_1'
extern type __MATH_PRECNAME(function,suffix) args __THROW
                            ^
/usr/include/math.h:66:42: note: expanded from macro '__MATH_PRECNAME'
#define __MATH_PRECNAME(name,r) __CONCAT(name,r)
                                         ^
/usr/include/x86_64-linux-gnu/sys/cdefs.h:88:23: note: expanded from macro '__CONCAT'
#define __CONCAT(x,y)   x ## y

我使用clang-3.5。所以我想问一下clang ++是否支持constexpr数学函数。如果是这样,我需要传递给clang的编译器标志?

1 个答案:

答案 0 :(得分:0)

cppreference并未将std::floor声明为constexpr。不确定是否有任何标准。我想编译器可能希望避免实现这一点,除非它符合某些标准,以避免不兼容的行为。根据{{​​3}},clang旨在支持C ++ 11和C ++ 1y(可能是C ++ 14),没有提到C ++特性的扩展。