恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式

Get string length function (strlen) of a constant char array is not a constant expression

本文关键字:strlen 表达式 函数 阵列 字符 获取 字符串      更新时间:2023-10-16

让我们直接查看简化的代码(由:GCC 6.3.0(

#include<iostream>
#include<cstring>
using namespace std;
int main(int arga, char* argv[]) {
    const char cs[] = "Hello";//define a constant c-style string 
    constexpr size_t newSize = strlen(cs) + strlen(" ");//Error
    return 0;
}

编译器产生了一个错误: strlen(((((const char*((&amp; cs(((不是常数表达式

但是,当我将C弦定义转移到全局范围时,问题就解决了。

.... 
const char cs[] = "Hello";
int main(int arga, char* argv[]) {
    constexpr size_t newSize = strlen(cs) + strlen(" ")//No Error
 ....
}

有人可以解释发生了什么吗?为什么 strlen((将全球定义的常数C弦视为常数表达式,而不是堆栈中的表达式?

标准strlen不是constepxr,因此,它不能在constexpr上下文中使用。但是,GCC知道strlen,因此在某些情况下可以计算字符串的长度 - 即使标准未授权/允许。

如果您仅关心数组,则可以使用std ::大小来获取它们的尺寸:

template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}