gpt4 book ai didi

c++ - constexpr 在函数调用中不起作用/应用

转载 作者:行者123 更新时间:2023-11-30 00:43:52 24 4
gpt4 key购买 nike

我已经实现了一个 constexpr 编译时散列函数,如果调用为,它可以正常工作(即在编译时求值)

constexpr auto hash = CompileTimeHash( "aha" );

但我需要在实际代码中将它用作函数的参数,如

foo( CompileTimeHash( "aha" ) ); // foo is NOT constexpr

由于特殊原因,我不能使用长版

constexpr auto hash = CompileTimeHash( "aha" );
foo( hash );

编译器 (VC++) 不会在短(第一种)情况下编译时散列。有什么办法可以实现吗?

编辑:现在可以在此处找到涵盖这 3 种情况的示例: https://godbolt.org/z/JGAyuE只有 gcc 在所有 3 种情况下都完成了它

最佳答案

好吧,as-if-rule 总是允许在运行时进行评估。无论这样做多么疯狂(而且极其复杂)。

强制编译器在编译时执行此操作的最佳方法是通过模板参数传递它:

一些设置:

template <auto x>
using make_integral_constant = std::integral_constant<decltype(x), x>;

template <auto x>
inline constexpr auto want_static = make_integral_constant<x>::value;

像这样使用它:

foo( want_static<CompileTimeHash( "aha" )> );

works even without optimization ,因为除非你使用解释器,否则在运行时执行它太复杂了,没有充分的理由。


分配给 constexpr 变量也应该有效。但实际上在编译时不求值更容易,所以 without optimization that happens anyway .

foo( []{ constexpr auto r = CompileTimeHash( "aha" ); return r; }() );

更新:在 C++ 20 中,一个新关键字 consteval 可用于定义立即函数,该函数将始终在编译时进行计算。 constinit 可用于强制使用 constexpr 规则进行初始化,而无需使其成为 constexpr

consteval auto immediate(auto x) { return x; }

关于c++ - constexpr 在函数调用中不起作用/应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004389/

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