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

标签 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");
}

编译命令:

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

最佳答案

函数参数永远不是常量表达式。请记住,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!
}

当给定常量表达式时,该函数可在常量表达式中调用。但它不能假设它只在常量表达式中被调用(我知道,人们可能会对它产生反感)。

关于c++ - 为什么参数不是常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421519/

相关文章:

c++ - QT从资源/指定路径加载dll

c++ - 为什么动态分配的内存需要类型转换?

c++ - OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?

C++:当动态库中的内联函数发生变化时要重新编译什么?

linux - 有什么方法可以在Linux平台上编译Microsoft样式的内联汇编代码?

c++ - 二进制 * 的无效操作数

linux - GCC是否支持命令文件

c++ - 使用聚合初始化器初始化类的模板(聚合类型)成员但没有额外的括号

c++ - std::transform 自定义树为新树

c++ - 在 std::vector::erase() 和 std::deque::erase() 中复制/移动赋值