gpt4 book ai didi

c++ - 强制执行 constexpr 函数的 constexpr-ness 的惯用方式

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:29 25 4
gpt4 key购买 nike

考虑以下示例代码:

#include <tuple>
void blah();
int buh;

constexpr auto get()
{
return std::get<0>(std::make_tuple(&blah, &buh));
}

int main()
{
get();
}

人们会期望因为函数 get() 是一个常量表达式,所以它会返回一个常量。

事实并非如此:std::make_tuplestd::get 被实例化并调用:https://godbolt.org/g/PkHrTp

现在,如果我们将 get() 的实现替换为

constexpr auto get() 
{
constexpr auto x = std::get<0>(std::make_tuple(&blah, &buh));
return x;
}

我们得到了预期的行为:参数 x 的计算被优化,即使在 -O0 时,make_tupleget 是未实例化,这对于减少二进制膨胀非常有用。

是否有一种惯用的方法来强制执行 constexpr auto foo() 形式的函数始终像第二个示例中那样运行?

现在我会求助于:

#define constexpr_return(X) do { constexpr auto constexpr_return_x_ = X; return constexpr_return_x_; } while(0)

constexpr_return(std::get<0>(std::make_tuple(&blah, &buh)));

例如,但我不知道这是否是最优的。

最佳答案

template<auto x>
std::integral_constant< std::decay_t<decltype(x)>, x > k{};

非类型模板参数实际上必须在编译时求值。

k<get()>或者在某些极端情况下 k<get()>()可能会做你想做的事。

这不适用于 constexpr不能作为非类型模板参数传递的值,但它确实适用于整数、指针和函数指针。

关于c++ - 强制执行 constexpr 函数的 constexpr-ness 的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50518458/

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