Bal*_*rva 2 c++ constexpr c++20
我已经阅读了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;
}
Run Code Online (Sandbox Code Playgroud)
随着分支 std::is_constant_evaluated()
更新
我可以将“解释性”信息“传输”到函数中吗?基本上决定f()是否使用constexprx 进行调用。
UPDATE 关于我要实现的目标的一个更复杂的示例:如果可能,此示例应在编译时对参数进行字符串化。
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;
}
Run Code Online (Sandbox Code Playgroud)
x不是常量表达式,无论f其自身如何评估。那是常规的if权利(应该如何is_constant_evaluated使用)。这不是一个废弃的分支,所以它即使包含结构良好的代码f是不是常数来进行评价。当x不是常量表达式时,该函数仍将包含该(未执行)分支,并且它将尝试x在需要常量表达式的地方使用。那是很糟糕的形式。
GCC非常不接受它是非常正确的。