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

Why is parameter not a constant expression?

提问人:embedc 提问时间:1/29/2019 更新时间:1/29/2019 访问量:2064

问:

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

// 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

评论

1赞 HappyCactus 1/29/2019
字符串不是整数值,因此在编译过程中无法解析。这与 find 的定义相矛盾。查看 en.cppreference.com/w/cpp/language/constexprconstexpr

答:

12赞 StoryTeller - Unslander Monica 1/29/2019 #1

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

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

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

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

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

评论

0赞 embedc 1/29/2019
您的示例使用参数来生成常量表达式,对吗?我的例子也是这样做的。有什么区别?
1赞 StoryTeller - Unslander Monica 1/29/2019
@embedc - 区别在于您的示例假设参数是无条件的,而我的则没有。constexpr