2013-01-09 3 views
4

코드 줄을 봤는데 제대로 작동하지 않을 것이라고 생각하지 않았습니다. 조건부 연산자가 값을 반환하고 참조로 작동하지 않는다고 생각했습니다.조건부 연산자는 참조를 반환 할 수 있습니까?

일부 의사 코드 :

#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 
} 

누군가가 설명 할 수 있습니까? 고마워.

답변

10

조건부 연산자에 대한 가정이 잘못되었습니다. 표현식의 유형은 표현식 c.getA()c.getB()의 유형이 동일하고 유형이 동일한 경우 lvalues를 나타내는 경우 전체 표현식도 마찬가지입니다.

당신도이 작업을 수행 할 수 있습니다. (정확한 규칙은 C++ 표준의 §5.16에) :

(condition? a: b) = value; 

조건부 valuea 또는 b 중 하나를 설정할 수 있습니다. 이것은 C++과 관련이 있습니다. C에서 조건부 연산자는 lvalue를 나타내지 않습니다.