恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式
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*((&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;
}
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使使用调试编译标志,表达式也是"optimized out"
- 恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式
- 布尔表达式中带有 strlen() 的奇怪行为