【问题标题】:Why does decltype on a string literal not yield an array type?为什么字符串文字上的 decltype 不会产生数组类型?
【发布时间】:2015-07-29 08:54:04
【问题描述】:

该标准在 §2.13.5/8 中定义了字符串文字的类型:

普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char 数组”,其中 n 是字符串的大小,定义如下,并且具有静态存储持续时间 (3.7)。

因此,例如,"sss" 应该有一个类型 char const[4](除非我读错了)。

但是这个简单的sn-p:

std::cout << std::boolalpha << std::is_pointer<decltype("sss")>::value << '\n';
std::cout << std::boolalpha << std::is_array<decltype("sss")>::value;

gives:

false
false

我错过了什么?

【问题讨论】:

标签: c++ arrays string c++11 decltype


【解决方案1】:

字符串字面量是左值([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 命名了一组 函数重载,程序格式错误;
  • 否则,如果 e 是 xvalue,则 decltype(e) 是 T&&,其中 T 是 e 的类型;
  • 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;
  • 否则,decltype(e) 是 e 的类型。

字符串字面量 Nconst char 的数组,但您所体验的是decltype 的效果。你真正拥有的是char const(&amp;)[N] 类型,不是 char const[N]

只需删除引用即可获得所需的行为:

std::is_array<std::remove_reference_t<decltype("sss")>>::value;

【讨论】:

    【解决方案2】:

    你必须先删除引用,因为decltype推导出的类型是const char (&amp;)[N],而不仅仅是const char [N]

    std::cout << std::boolalpha << std::is_array<
        typename std::remove_reference<decltype("sss")>::type
    >::value << '\n'; // true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2012-06-10
      • 2019-11-21
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多