为何WinAPI的HWND_MESSAGE不是编译时常量?
为什么HWND_MESSAGE无法作为constexpr变量初始化?
你的代码编译失败的核心原因是:HWND_MESSAGE并不是C++标准意义上的编译期常量。
具体细节
HWND_MESSAGE在Windows SDK中的定义本质是(HWND)-3,这是一个将负数强制转换为指针类型的值。而C++的constexpr对指针类型的常量表达式有严格要求:
- 只能是
nullptr - 或者指向静态存储期的已知对象的指针
- 或者指向这些对象成员的指针
显然,(HWND)-3这种负数强转的指针完全不符合上述规则,编译器无法在编译阶段将其评估为合法的常量表达式,因此抛出C2131错误。
解决办法
如果你只是需要在运行时使用HWND_MESSAGE这个特殊窗口句柄,只需要去掉constexpr修饰符即可:
#include <windows.h> int main(){ const auto test = HWND_MESSAGE ; }
这段代码可以正常编译,因为运行时系统会明确这个特殊指针的值,只是编译期无法满足constexpr的严格要求。
内容的提问来源于stack exchange,提问作者Mercalli
相关产品推荐
相关产品推荐

