为什么参数不是常量表达式?

emb*_*edc 11 c++ gcc c++14

你能解释为什么这段代码不能编译吗?

// 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");
}
Run Code Online (Sandbox Code Playgroud)

编译命令:

$ g++ -std=c++14 source.cpp
Run Code Online (Sandbox Code Playgroud)

我试过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);
                                          ^
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 11

函数参数永远不是常量表达式.请记住,constexpr函数就像常规函数一样.它们也可以在运行时调用.所以我们不能假设传入的地址param是一个常量表达式,因此不能用它来初始化constexpr变量或返回值.

可以将字符串文字传递给constexpr函数并生成constexpr结果,例如:

constexpr bool find(const char *param) {
   return (param[0] == 0);
}

int main()
{
   constexpr bool result = find("abcde"); // OK!
}
Run Code Online (Sandbox Code Playgroud)

当给定常量表达式时,该函数可以在常量表达式中调用.但它不能假设它只是在一个恒定的表达式中被调用(我知道,人们可以全神贯注地思考它).