将非类非数组prvalue强制转换为cv限定类型是否合法?

时间:2017-03-21 14:53:45

标签: c++ language-lawyer value-categories

我正在阅读value categories,并且遇到了以下内容(为简洁起见省略了很多):

  

以下表达式是prvalue表达式:

     
      
  • 文字(字符串文字除外),例如42,true或nullptr;
  •   
     

属性:

     
      
  • 非类非数组prvalue不能通过cv限定。
  •   

但是......以下程序编译并运行正常on ideone.com和g ++ 5.4.0:

#include <iostream>

int main() {
    std::cout << ((const int) 42) << std::endl;
}

我理解编译器提供扩展,并且如果未定义的行为被击中,它可以做各种事情。我只想弄清楚标准的要求。

N4296中,我发现以下相关段落:

  

[EXPR]

     

[...内容省​​略...]

     
      
  1. 如果prvalue最初具有“cv T”类型,其中T是a   cv-unqualified non-class,non-array type,表达式的类型   在进行任何进一步分析之前,将其调整为T.
  2.   

“最初”这个词引起了我的兴趣。目前尚不清楚是否允许将其作为另一个表达式的结果,例如用户将非类非数组prvalue显式地转换为cv限定类型(产生另一个prvalue),或者这是否仅适用于“root” “表达式(在这种情况下为42)。

我的问题是,标准是否允许这样的表达式(只是剥离了cv限定符),或者这是否被禁止(如果相关,这是强制要求的地方)?

2 个答案:

答案 0 :(得分:2)

您应该意识到cppreference不是规范性的。 &#34;不能&#34;可以通过两种方式阅读:

  • 这是禁止的,ala&#34;不得&#34;

  • 根本不可能发生,ala不变量

您在文中列出的引文:

  

如果prvalue最初具有“cv T”类型,其中T是a   cv-unqualified non-class,non-array type,表达式的类型   在进行任何进一步分析之前,将其调整为T.

告诉我,cv合格的prvalue会降低资格,就像数组可以衰减到指针一样(澄清一下,这个规则不会发生在演员阵容错误的地方)。缺陷#1261确实使语言非常明确地说明了在哪里发生的事情。

答案 1 :(得分:2)

感谢SanderDeDycker指出要搜索的标准的相关部分。

我的问题在N4296的以下部分回答(强调我的):

  

<强> [expr.cast]

     
      
  1. 表达式(T)cast-expression的结果是T型。该   如果T是左值引用类型或右值,则结果是左值   如果T是右值引用,则引用函数类型和xvalue   对象类型;否则结果是一个prvalue。 [注意:如果T是   cv限定的非类型类型,cv限定符被丢弃   在确定所得到的prvalue的类型时;见第5条。 -   尾注]
  2.   

因此我们可以得出结论,(const int) 42之类的表达式是完全合法的C ++。