5

私はコードの行に出くわしましたが、それがうまくいくとは思いもしませんでした。条件演算子の戻り値を考えたのですが、参照では動作しません。

いくつかの擬似コード:

#include <iostream>

using namespace std;

class A {
public:
  A(int input) : v(input) {};
  void print() const { cout << "print: " << v  << " @ " << this << endl; }
  int v;
private:
  //A A(const A&);
  //A operator=(const A&);
};

class C {
public:
  C(int in1, int in2): a(in1), b(in2) {}
  const A& getA() { return a;}
  const A& getB() { return b;}
  A a;
  A b;
};

int main() {
  bool test = false;
  C c(1,2);
  cout << "A @ " << &(c.getA()) << endl;
  cout << "B @ " << &(c.getB()) << endl;

  (test ? c.getA() : c.getB()).print();  // its working
}

誰かが説明できますか?どうも。

4

1 に答える 1

11

条件演算子についてのあなたの仮定は間違っています。式のタイプは、式が持つタイプc.getA()c.getB()同じであり、同じタイプである場合、および左辺値を表す場合は、式全体も同様です。(正確なルールはC ++標準の§5.16にあります。)

あなたもこれを行うことができます:

(condition? a: b) = value;

条件付きでaまたはbに設定しますvalue。これはC++固有であることに注意してください。Cでは、条件演算子は左辺値を示しません。

于 2013-01-09T11:10:52.360 に答える