我有一个计算字符串文字的哈希值的函数:
inline consteval uint64_t HashLiteral(const char* key)
{
// body not important here...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在另一个函数中,我需要文字字符串及其哈希值,我想在编译时计算它:
void function(const char* s)
{
worker(s, HashLiteral(s));
}
Run Code Online (Sandbox Code Playgroud)
然而,似乎不可能进行这样的调用function("string"),并在编译时在其主体中计算哈希值。我现在想到的最好方法是使用宏,并重新定义函数:
#define MakeHashParms(s) s,HashLiteral(s)
void function(const char* s, const uint64_t hash)
{
worker(s, hash);
}
function(MakeHashParms("string"));
Run Code Online (Sandbox Code Playgroud)
是否可以有更直接的解决方案?
下面的代码重现了我遇到的问题,MSVC 2022:
#include <iostream>
struct A {
static void message()
{
std::cout << "A::message()\n";
}
struct B {
B() {}
~B()
{
A::message();
}
};
static inline B b;
};
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
通过上面的代码,我看到如预期的那样出现了消息。然而:
B(),那么析构函数~B()似乎被删除,因为消息消失了。int dummy;向结构添加一个虚拟属性B,则该消息会再次出现。我确实找不到答案的问题:
B(),也没有属性B,编译器只是将类标记B为空,然后完全跳过它。它是否正确?B()足够,或者我还应该使用B虚拟属性使其非空int dummy;?