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

12

请问为什么这段代码无法编译?

// 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);
                                          ^

1
一个字符串不是整型值,因此在编译期间无法解析。这与constexpr中find的定义相矛盾。请参见https://en.cppreference.com/w/cpp/language/constexpr。 - HappyCactus
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!
}

当给定一个常量表达式时,该函数可在常量表达式中调用。但不能假设它只会在常量表达式中被调用(我知道,想想它可能会让人眼花缭乱)。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接