C++ constexpr在函数调用内不工作/应用

C++ constexpr在函数调用内不工作/应用,c++,c++17,constexpr,compile-time,compile-time-constant,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 );

我已经实现了一个constexpr编译时哈希函数,它工作得很好,也就是说,如果调用

constexpr auto hash = CompileTimeHash( "aha" );
但我需要在实际代码中使用它作为函数的参数,如

foo( CompileTimeHash( "aha" ) ); // foo is NOT constexpr
由于特定的原因,我不能使用长版本

constexpr auto hash = CompileTimeHash( "aha" );
foo( hash );
在第一种情况下,编译器VC++不会编译时哈希。 有没有办法做到这一点

编辑:下面是一个涵盖这3种情况的示例:
只有gcc在所有3种情况下都能完成这项工作。

好吧,假设规则总是允许在运行时进行计算。无论这样做多么疯狂和复杂

要强制编译器在编译时执行此操作,请通过模板参数传递:

一点设置:

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;

更新:在C++ 20中,一个新的关键字CONSTEVAL可以用来定义一个即时函数,它总是在编译时被评估。constinit可用于强制使用constexpr规则初始化,而无需将其设置为constexpr


好吧,假设规则总是允许在运行时进行计算。无论这样做多么疯狂和复杂

要强制编译器在编译时执行此操作,请通过模板参数传递:

一点设置:

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;

更新:在C++ 20中,一个新的关键字CONSTEVAL可以用来定义一个即时函数,它总是在编译时被评估。constinit可用于强制使用constexpr规则初始化,而无需将其设置为constexpr


如果我理解正确,您的CompileTimeHash将返回一个int

那怎么办

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

显然,如果CompileTimeHash只返回正数

如果CompileTimeHash返回非负数、正数或零,则可以解决零问题,因为C样式数组的大小为“1内加1外减”,所以不能接受零问题

我是说

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

如果我理解正确,您的CompileTimeHash将返回一个int

那怎么办

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

显然,如果CompileTimeHash只返回正数

如果CompileTimeHash返回非负数、正数或零,则可以解决零问题,因为C样式数组的大小为“1内加1外减”,所以不能接受零问题

我是说

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

你怎么知道哈希函数是在运行时计算的?@Someprogrammerdude你怎么知道哈希函数是在运行时计算的?您可以通过在静态资产中调用它来检查您使用的是哪个版本的VC++?还有,我们能得到一个测试其他编译器吗?@Someprogrammerdude,你在等,调试或发布版本中的断点?调试不相关;释放是不可信的。再说一遍,你怎么知道的?nm是一个强有力的例子。你怎么知道哈希函数是在运行时计算的?@Someprogrammerdude你怎么知道哈希函数是在运行时计算的?您可以通过在静态资产中调用它来检查您使用的是哪个版本的VC++?还有,我们能得到一个测试其他编译器吗?@Someprogrammerdude,你在等,调试或发布版本中的断点?调试不相关;释放是不可信的。再说一遍,你怎么知道的?nm是一个强有力的例子。@old123987-ehmm。。。不如果CompileTimeHash返回负数或零,则无法工作;但对于正数…即使它是一个无符号整数而不是整数-这是一个复杂的解决方案。巴洛克风格,令人困惑,可能会被未来的维护者撤销或滥用-1.即使它是一个无符号int,我的解决方案在零情况下也是有问题的;我不同意你的观点,因为以下是令人费解的、巴洛克式的、令人困惑的。。。但是谢谢你解释你的反对票。@old123987-ehmm。。。不如果CompileTimeHash返回负数或零,则无法工作;但对于正数…即使它是一个无符号整数而不是整数-这是一个复杂的解决方案。巴洛克风格,令人困惑,可能会被未来的维护者撤销或滥用-1.即使它是一个无符号int,我的解决方案在零情况下也是有问题的;我不同意你的观点,因为以下是令人费解的、巴洛克式的、令人困惑的。。。但是谢谢你解释你的反对票。