我遇到以下代码有问题,我正在编写一个编译时平方根函数。代码编译最近的铛铛6.0。 在最新版本的gcc 8.0上失败。这个问题似乎与结构的初始化有关。在constexpr函数中嵌套的struct,在clang中编译,在gcc中失败
GCC输出
error: uninitialized variable 'sqrtNewtonRaphson' in 'constexpr' context
} sqrtNewtonRaphson;
^~~~~~~~~~~~~~~~~
GCC的最后一个版本的代码编译的是gcc 6.3,在之后的以下版本,compile_time_sqrt_ver1(双)无法编译。
//------------------------------------------------------------
constexpr double
compile_time_sqrt_ver1(double x) {
struct {
constexpr double operator() (double x, double current, double previous) {
return current == previous ? current : (*this)(x, 0.5 * (current + x/current), current);
}
} sqrtNewtonRaphson;
return x >= 0 && x < std::numeric_limits<double>::infinity()
? sqrtNewtonRaphson(x, x, 0)
: std::numeric_limits<double>::quiet_NaN();
}
//------------------------------------------------------------
int main() {
constexpr double test_v1 = compile_time_sqrt_ver1(24);
return test_v1;
}
我发现这一点的解决方案是增加{}在结构的结尾使得它在最近版本的GCC编译的,以及铿锵。为什么是这样?
//------------------------------------------------------------
constexpr double
compile_time_sqrt_ver2(double x) {
struct {
constexpr double operator() (double x, double current, double previous) {
return current == previous ? current : (*this)(x, 0.5 * (current + x/current), current);
}
} sqrtNewtonRaphson{}; // <- change {}
return x >= 0 && x < std::numeric_limits<double>::infinity()
? sqrtNewtonRaphson(x, x, 0)
: std::numeric_limits<double>::quiet_NaN();
}
//------------------------------------------------------------
int main() {
constexpr double test_v2 = compile_time_sqrt_ver2(24);
return test_v2;
}
现场演示https://godbolt.org/g/xw8rcr – DanielCollier
顺便说一句,为什么你需要一个嵌套的结构在这里? – erenon
@erenon因为我不需要在其他地方调用函数。并且递归lambda不是一件事 – DanielCollier