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

时间:2018-08-24 12:21:20

标签: c++ c++17 constexpr compile-time compile-time-constant

我已经实现了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 在所有3种情况下,只有gcc才能做到

2 个答案:

答案 0 :(得分:7)

那么,按规则执行总是允许在运行时进行评估。但是,这样做可能很疯狂(而且非常复杂)。

强制编译器在编译时执行此操作的最佳方法,将其传递给模板参数:

一些设置:

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; }() );

答案 1 :(得分:-1)

如果我理解正确,那么您的CompileTimeHash()将返回int

foo( sizeof(char[CompileTimeHash( "aha" )]) );

很明显,如果CompileTimeHash()仅返回正数。

如果CompileTimeHash()返回非负数(正数或零),则可以解决零问题(C型数组的大小不可接受)加(内)和减(外)1

我的意思是

foo( sizeof(char[CompileTimeHash( "aha" )+1])-1u );