【问题标题】:Pre-incrementing a string literal预递增字符串文字
【发布时间】:2014-12-09 09:12:59
【问题描述】:

N3337 标准草案第 2.14.5/8 条规定:

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

第 4.2 节

“N T 数组”或“未知边界数组”类型的左值或右值 of T”可以转换为“pointer to T”类型的纯右值。结果 是指向数组第一个元素的指针。

我预计 ++"hello world!" 会衰减 "hello world!"char* 但这不会发生。必须使用额外的加号+++"hello world!" 强制它。在某些情况下不应用数组到指针的转换,例如sizeof 运算符。

第 5.3.2 节简单地说:

前缀++的操作数加1修改,如果加1则设置为true 是布尔型(不推荐使用此用法)。操作数应为可修改的 左值。操作数的类型应为算术类型或 指向完全定义的对象类型的指针。结果是更新了 操作数;它是一个左值,如果操作数是一个位域 位域。如果 x 不是 bool 类型,则表达式 ++x 等价 到 x+=1

那么为什么没有发生这种转换呢?

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

    根据 5/8,当需要将 glvalue 转换为 prvalue 时,将应用数组到指针(和其他衰减)转换:

    当一个泛左值表达式作为一个操作数的一个操作数出现时,该操作数需要一个纯右值, 应用左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换 将表达式转换为纯右值。

    请注意,通过您自己对 5.3.2 的引用,++ 的操作数必须是可修改的左值。数组到指针的转换用于将 glvalue 转换为 prvalue,这不是 ++ 需要的。因此,不需要数组到指针的转换。应用它实际上是无效的,因为该转换的结果是一个纯右值,++ 无法对其进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2019-04-29
      • 2013-04-11
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多