【问题标题】:Return type of ?: operator, and phrasing in C++ Primer?: 运算符的返回类型和 C++ Primer 中的措辞
【发布时间】:2015-03-23 17:01:46
【问题描述】:

我阅读这篇文章是为了大致了解条件运算符返回的类型和值类别:Return type of '?:' (ternary conditional operator)

这几乎回答了我的问题,除了 C++ Primer 中描述同一事物的措辞让我有些困惑。

“如果两个表达式都是左值或者如果它们都转换为常见的左值类型,则条件运算符的结果是左值。否则结果是右值。”

粗体字让我很反感。这会向我建议,例如

int main(){

    int y = 2;
    char z = 3;

    ((50<60) ? y : z) = 3;
}

会很好,因为 y 和 z 都可以转换为 int (嗯,z 将是转换的那个),它是一种左值类型(对吗?),因此条件运算符会将左值作为其值类别。但是,此代码无法编译,因为它实际上给出了一个右值。谁能提供一个粗体部分提到的例外情况的例子,所以我可以理解它试图说明什么?

我的理解似乎是:如果表达式是相同类型的左值,则返回该类型的左值。否则返回一个右值(某些编译器确定的类型)。

【问题讨论】:

    标签: c++ conditional-operator lvalue


    【解决方案1】:

    如果将z 转换为int,则已经应用了左值到右值的转换,结果是右值,而不是左值。

    ?: 的一个示例,其中两个操作数具有不同的类型,但结果是左值,即一个是 const-qualified 而另一个不是:

    const int &f(bool a, int &b, const int &c) {
      // b has type int, c has type const int, the result is an lvalue of type const int
      return a ? b : c;
    }
    

    另一个例子是一个带有自定义转换运算符的类:

    struct S {
      operator int&();
    };
    int &f(bool a, int &b, S &c) {
      // b has type int, c has type S, the result is an lvalue of type int
      // if a is false, c's conversion operator is called
      return a ? b : c;
    }
    

    【讨论】:

    • 谢谢。这至少可以解决问题。我认为最后一个示例目前有点超出我的范围,当我了解有关转换运算符的更多信息时,我会回到它。
    猜你喜欢
    • 2021-11-19
    • 2011-07-20
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2015-07-16
    相关资源
    最近更新 更多