为什么对字符串字面值的decltype不产生数组类型
Why does decltype on a string literal not yield an array type?
标准在§2.13.5/8中定义了字符串文字的类型:
普通字符串字面值和UTF-8字符串字面值也被称为窄字符串字面值。窄字符串字面值的类型为" array of n const char ",其中n是下面定义的字符串的长度,并具有静态存储持续时间(3.7)。
因此,例如,"sss"
应该具有类型char const[4]
(除非我读错了)。
但是这个简单的片段:
std::cout << std::boolalpha << std::is_pointer<decltype("sss")>::value << 'n';
std::cout << std::boolalpha << std::is_array<decltype("sss")>::value;
给:
false
false
我错过了什么?
字符串字面值为左值([expr.prim.general]/p1):
字面量是主表达式。它的类型取决于它的形式(2.13)。字符串字面值是左值;所有其他字面值都是左值。
当表达式expr
为左值表达式([dcl.type.simple]/p4)时,
decltype(expr)
返回左值引用:
对于表达式e,用decltype(e)表示的类型定义为:
- 如果e是未加括号的id表达式或未加括号的类成员访问(5.2.5),则decltype(e)是实体的类型如果没有这样的实体,或者如果e命名了一组重载函数时,程序是病态的;
- 否则,如果e是一个x值,则decltype(e)为T&&,其中T为e的类型;
- 否则,如果e为左值,则decltype(e)为T&,其中T为e的类型;
- 否则,decltype(e)为e的类型。
字符串字面值是N
const char
的数组,但是您正在经历的是decltype
的效果。你真正拥有的是类型char const(&)[N]
,而不是 char const[N]
。
简单地删除引用应该会给你想要的行为:
std::is_array<std::remove_reference_t<decltype("sss")>>::value;
您必须首先删除引用,因为decltype
推断的类型是const char (&)[N]
,而不仅仅是const char [N]
:
std::cout << std::boolalpha << std::is_array<
typename std::remove_reference<decltype("sss")>::type
>::value << 'n'; // true
相关文章:
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 取消引用结束指针到数组类型的一个
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何在数组类型的模板代码中计算std::size_t
- LLVM 无法将数组类型强制转换为常量数组
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 特征:从数组类型中获取标量类型是否记录?
- T D[N] 总是声明数组类型的对象吗?
- 如何在模板中推断数组类型?
- 尝试使用 Array 类的模板构造整数数组时,错误:为什么数组类型"int [5]"不可分配,
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 如何为所有非数组类型专门化模板?
- 数组类型 (C++) 的初始化
- 我预测char数组类型值只能投射指针类型
- 将数组类型更改为 Int16 会节省存储空间吗?
- 采用通用数组类型的函数
- 数组类型 'int [8]'不可分配
- 数组类型 'float [size]'不可分配
- C++。候选模板被忽略 - 无法将数组类型与自身匹配