![](/img/trans.png)
[英]Why the expression strlen(cstr1) did not evaluate to a constant, where cstr1 is a const char array?
[英]Get string length function (strlen) of a constant char array is not a constant expression
讓我們直接看一下簡化的代碼(編譯: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 *)(&cs)))不是常量表達式
但是,當我將c字符串定義移動到全局范圍時,問題就會消失。
....
const char cs[] = "Hello";
int main(int arga, char* argv[]) {
constexpr size_t newSize = strlen(cs) + strlen(" ")//No Error
....
}
有人能解釋發生了什么嗎? 為什么strlen()將全局定義的常量c-string視為常量表達式,而不是堆棧中的那個?
標准strlen
不是constepxr
,因此,它不能用於constexpr
上下文。 但是,GCC 知道strlen ,因此在某些情況下它能夠計算字符串的長度 - 即使它沒有被標准規定/允許。
如果您只關心數組,可以使用std :: size來獲取它們的大小:
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
return N;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.