【发布时间】:2019-10-28 03:54:07
【问题描述】:
我正在尝试创建一个基于 Linux 的项目,该项目用 C++17 编写,可以在 OSX (Mojave) 上运行。大多数东西都编译得很好,直到我得到这个文件:ClassName.hpp:
class ClassName {
public:
static constexpr double DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1 = 2; // represents 0.99
static constexpr double DEFAULT_TARGET_TFINAL_DIGITS_FROM_0 = 10; // represents 1e-10
static constexpr double DEFAULT_TARGET_INITIAL_PBAD = (1-pow(10,-DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1));
static constexpr double DEFAULT_TARGET_FINAL_PBAD = pow(10,-DEFAULT_TARGET_TFINAL_DIGITS_FROM_0);
static constexpr double DEFAULT_ERROR_TOL_DIGITS = 0.9; // as a fraction of digits in the last place from the above.
static constexpr double DEFAULT_SAMPLE_TIME = 1;
// more unrelated code
};
编译时出现以下错误:
error: constexpr variable
'DEFAULT_TARGET_INITIAL_PBAD' must be initialized by a constant expression
...double DEFAULT_TARGET_INITIAL_PBAD = (1-pow(10,-DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClassName.hpp: note: non-constexpr function 'pow<int, double>'
cannot be used in a constant expression
static constexpr double DEFAULT_TARGET_INITIAL_PBAD = (1-pow(10,-DEFAULT_TARGET_TINITI...
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h:968:1: note:
declared here
pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
所以由于某种原因,这适用于 Ubuntu 和 CentOS。我认为这与pow 的定义方式有关吗?但我不确定如何解决它,或者这是否是问题所在。我也尝试从DEFAULT_TARGET_TINITIAL_DIGITS_FROM_1 和DEFAULT_TARGET_TFINAL_DIGITS_FROM_0 中删除constexpr 并使其成为const,但仍然遇到同样的问题。
【问题讨论】:
-
std::pow和函数std::pow调用必须是constexpr检查函数的标准源。您也许可以从一个库中替换。或者,只需在运行时初始化静态。 -
有一个较老的问题指出标准不允许它们成为
constexpr,至少在 C++14 中是这样。这在 C++17 中有改变吗? stackoverflow.com/questions/27744079/… -
@MichaelAnderson 我不相信它在 C++17 中。没有明显的理由它不可能但不会是标准的。
-
@MichaelAnderson 所以问题归结为破坏使用
errnoGrr 的现有代码。
标签: c++ macos compiler-errors constexpr