为什么 constexpr 函数中的参数不是常量表达式?

问题描述 投票:0回答:1

您能解释一下为什么这段代码无法编译吗?

// 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);
                                          ^
c++ gcc c++14 constexpr constant-expression
1个回答
12
投票

函数参数永远不是常量表达式。请记住,

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

可以将字符串文字传递给

constexpr
函数并产生
constexpr
结果,例如

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

int main()
{
   constexpr bool result = find("abcde"); // OK!
}

当给定常量表达式时,该函数可以在常量表达式中调用。但它不能假设它只在常量表达式中被调用(我知道,人们可能会斗鸡眼地思考它)。

© www.soinside.com 2019 - 2024. All rights reserved.