具有类类型左值操作数

时间:2015-08-26 03:52:02

标签: c++ conditional-operator lvalue rvalue

如果条件表达式的第二个和第三个操作数是类类型的左值,我试图找出条件表达式结果的值类别。

示例:

struct S {};
S x, y;
void foo(bool cond) {
  cond ? x : y;  // what is the value category of the result?
}

我在[expr.cond]中看到两个不同的段落说不同的东西。

根据第4段:

  

如果第二个和第三个操作数是相同值类别且具有相同类型的glvalues,结果属于该类型和值类别

这段似乎适用,并且说结果是左值,因为第二个和第三个操作数都是相同类型的左值。

然而,根据第6段:

  

Lvalue-to-rvalue,数组到指针和函数到指针标准   转换在第二个和第三个操作数上执行。后   这些转换,以下之一应该成立:

     
      
  • 第二个和第三个操作数具有相同的类型;结果是那种类型。如果操作数具有类类型,则结果是结果类型的prvalue临时值,它根据第一个操作数的值从第二个操作数或第三个操作数复制初始化。
  •   

这一段似乎也适用,并说表达式的结果是一个右值。

它是哪个 - 左值还是左值?这两段是否真的相互矛盾,还是我错过了一些微妙的东西?

1 个答案:

答案 0 :(得分:4)

您必须按顺序阅读段落,然后选择适用的第一段。强调我的。

1

  

...

2

  

如果第二个或第三个操作数的类型为void ...

3

  

否则,如果第二个和第三个操作数具有不同的类型并且具有(可能是cv-qualified)类   类型,或者两者都是相同值类别和相同类型的glvalues,除了cv-qualification ...

4

  

如果第二个和第三个操作数是相同值类别的glvalues并且具有相同的类型......

5

  

否则,结果是prvalue。如果第二个和第三个操作数不具有相同的类型,则任何一个   具有(可能是cv限定的)类类型,重载决策用于确定转换(如果有)   适用于操作数(13.3.1.2,13.6)。如果重载决策失败,则程序格式错误。   的否则,   应用如此确定的转换,并使用转换的操作数代替原始操作数   本节其余部分的操作数。

6

  

Lvalue-to-rvalue(4.1),array-to-pointer(4.2)和function-to-pointer(4.3)标准转换是per-   在第二和第三个操作数上形成。 ...