gpt4 book ai didi

c++ - constexpr 适用于 Ubuntu,但不适用于 MacOS

转载 作者:行者123 更新时间:2023-11-28 04:13:12 25 4
gpt4 key购买 nike

我的这段代码在 Ubuntu 上编译得很好,但是当我尝试在 MacOS 上编译它时,我得到了这个错误:

Constexpr variable 'HeuristicNames' must be initialized by a constant expression
#define LSHPair std::pair<const char *, LISTSCHED_HEURISTIC>
static constexpr LSHPair HeuristicNames[] = {
LSHPair("CP", LSH_CP), LSHPair("LUC", LSH_LUC),
LSHPair("UC", LSH_UC), LSHPair("NID", LSH_NID),
LSHPair("CPR", LSH_CPR), LSHPair("ISO", LSH_ISO),
LSHPair("SC", LSH_SC), LSHPair("LS", LSH_LS),
LSHPair("LLVM", LSH_LLVM)};

LISTSCHED_HEURISTIC 是一个enum

我认为这个错误意味着赋值右侧的某些部分不是 constexpr,因此结果变量不能是 constexpr。但是,我对 constexpr 周围的规则没有足够的把握来理解为什么或如何修复它。

我也不明白为什么这在 MacOS 上与在 Ubuntu 上不同。任何人都可以阐明这一点吗?

最佳答案

首先你不需要宏。你可以定义类型

using LSHPair =  std::pair<const char *, LISTSCHED_HEURISTIC>;

或者只使用大括号初始化,什么更干净:

using LSHPair =  std::pair<const char *, LISTSCHED_HEURISTIC>;

static constexpr LSHPair HeuristicNames[] = {
{"CP", LSH_CP},
{"LUC", LSH_LUC},
{"UC", LSH_UC},
{"NID", LSH_NID},
{"CPR", LSH_CPR},
{"ISO", LSH_ISO},
{"SC", LSH_SC},
{"LS", LSH_LS},
{"LLVM", LSH_LLVM}
};

正如@CuriouslyRecurringThoughts 指出的那样 constructor of std::pair is a constexpr since c++14 .

我已经在我的 Mac OS 上测试过它,显然 clang 的工作方式与在 Linux 上有点不同(如 shown on compiler explorer ):

Marek R$ g++ main.cpp -std=c++11
main.cpp:17:26: error: constexpr variable 'HeuristicNames' must be initialized by a constant expression
static constexpr LSHPair HeuristicNames[] = {
^ ~
main.cpp:18:5: note: non-constexpr constructor 'pair<char const (&)[3], LISTSCHED_HEURISTIC, false>' cannot be used in a constant expression
{"CP", LSH_CP},
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/utility:446:5: note: declared here
pair(_U1&& __u1, _U2&& __u2)
^
1 error generated.
Marek R$ g++ main.cpp -std=c++14
Marek R$

所以 MacOS clang 是正确的。

问题一定出在头文件上,并根据 C++ 标准对它们进行版本控制。很可能标准库的相同头文件用于 clang,而 gcc 在 Linux 上使用。在 Mac 上,std::pair 构造函数以宏 _LIBCPP_CONSTEXPR_AFTER_CXX11 为前缀,该定义在启用 C++ 标准时发生变化。在 Linux 上,您必须自己检查它是如何完成的。

关于c++ - constexpr 适用于 Ubuntu,但不适用于 MacOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57230439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com