能否请您解释为什么此代码无法编译?
// source.cpp
constexpr const char* func(const char* s) { return s;}
constexpr bool find(const char *param) {
constexpr const char* result = func(param);
return (param == 0);
}
int main()
{
constexpr bool result = find("abcde");
}
编译命令:
$ g++ -std=c++14 source.cpp
我尝试了gcc5.4和gcc6.4。错误:
source.cpp: In function ‘constexpr bool find(const char*)’:
source.cpp:5:46: error: ‘param’ is not a constant expression
constexpr const char* result = func(param);
^
答案 0 :(得分:11)
函数参数绝不是常量表达式。请记住,constexpr
函数就像常规函数一样。也可以在运行时调用它们。因此,我们不能假设传入param
的地址是一个常量表达式,因此不能使用它来初始化constexpr
变量或返回值。
您可以将字符串文字传递给constexpr
函数,并产生constexpr
个结果,for instance:
constexpr bool find(const char *param) {
return (param[0] == 0);
}
int main()
{
constexpr bool result = find("abcde"); // OK!
}
给定常量表达式后,该函数可在常量表达式中调用。但是它不能假设它只是在常量表达式中被调用过(我知道,对此人们可以cross目结舌)。