c++ - is_constant_evaluate() 应该产生 constexpr 变量吗?
问题描述
我已经阅读了std::is_constant_evaluated()
定义,但我仍然不确定为什么 (1) 不能与最新的 GCC一起使用:error: 'x' is not a constant expression
template<auto v>
struct s
{};
constexpr void f(int x)
{
if (std::is_constant_evaluated())
{
// constexpr int z=x; (1)
// s<x> a; (2)
}
}
int main(int argc, char* argv[])
{
f(4);
//f(argc);
return 0;
}
- 按照标准,这应该有效吗?
- 还是只是 GCC 的实现有问题?
- 我能以某种方式实现预期的行为吗?基本上是:
随着分支std::is_constant_evaluated()
- 如果为真:代码可以使用变量作为 constexpr(如 (2))
- 如果为假:代码使用变量作为非 constexpr
更新
我可以将 constexpr-essiveness 信息“传输”到函数中吗?基本上决定f()
是否用constexpr
x 调用它。
更新 关于我想要实现的更复杂的示例:如果可能,此示例应在编译时对参数进行字符串化。
template<auto v>
struct dummy_stringify
{
static constexpr auto str=v==4 ? "4" : "31"; // this is just an example; imagine here a much more complex logic
};
constexpr void f(int x)
{
if (std::is_constant_evaluated())
{
std::puts("A compile time calculation:");
//std::puts(dummy_stringify<x>::str);
} else
{
std::cout<<"A runtime calculation:"<<std::endl;
std::cout<<x<<std::endl;
}
}
int main(int argc, char* argv[])
{
f(4);
f(argc);
return 0;
}
解决方案
x
不是一个常量表达式,不管它f
本身是如何计算的。那是if
那里的常规(如何is_constant_evaluated
使用)。它不是一个废弃的分支,因此即使不是不断评估,它也必须包含格式良好f
的代码。当x
将不是常量表达式时,该函数仍将包含该(未执行的)分支,并且它将尝试x
在需要常量表达式的地方使用。这显然是不正确的。
GCC 不接受它是非常正确的。
推荐阅读
- jquery - 使用 JSON 缓存后保持选中单选按钮
- python - 在 Python 中实现模块热重载的最佳方法是什么?
- python - 实时 matplotlib 绘图保持轴值(x 轴上只有 10 个)
- java - 如何在线程中有一个有效的循环
- javascript - 如何在javascript中将切换功能转换为模块模式?
- ios - 应用程序重新启动时如何恢复计时器?斯威夫特 4 iOS 11
- python - 我应该如何通过网络(wifi)访问连接到笔记本电脑(python)中树莓派的网络摄像头?
- python - 在循环键更新值时,所有键值都在字典中更新?
- tensorflow.js - 如何将一维张量转换为常规 JavaScript 数组?
- python - 张量流中的采样