我正在使用Visual Studio 2013 + CTP。
我定义了以下功能:
constexpr DWORD const_getHash(const char *str, DWORD curHash = 0) {
return !*str ? curHash : const_getHash(str + 1,
(curHash >> 13 | curHash << (32 - 13)) + (*str >= 'a' ? *str - 32 : *str));
}
我这样使用:
DWORD hash = const_getHash("ok");
编译器不会发出任何警告,但通过查看“反汇编”,我可以看出const_getHash()是在运行时执行的。
怎么了?
编辑:如果我强制在编译时使用
执行该函数constexpr DWORD hash = const_getHash("ok");
编译器说
Error 1 error C2127: 'hash': illegal initialization of 'constexpr' entity with a non-constant expression
答案 0 :(得分:0)
constexpr
不会强制在编译时执行该函数。它只是告诉编译器 函数可以在编译时执行 ,如果需要 。
当
constexpr
函数的所有参数都是常量表达式并且结果也用在常量表达式中时,它将在编译时进行评估。
(引用接受的答案here。)