让我们直接看看简化代码(由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-string视为常量表达式,而不是堆栈中的那个?
答案 0 :(得分:6)
标准strlen
不是constepxr
,因此,它无法在constexpr
上下文中使用。但是,GCC knows about strlen因此能够在某些情况下计算字符串的长度 - 即使它没有被标准规定/允许。
如果您只关心数组,可以使用std::size来获取它们的大小:
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
return N;
}