2015-01-24 6 views
3

는 조건 연산자에서 반환 된 다음 말씨를 제외하고, 거의 내 질문에 대한 대답 Return type of '?:' (ternary conditional operator)반환 유형 : C++ 입문서 연산자, 그리고 말씨 내가 유형과 값 카테고리의 개요를 얻을이 게시물을 읽을

C++에서 같은 것을 설명하는 입문서는 약간 혼란 스럽습니다.

"양쪽 표현식이 모두 왼쪽 값 이거나 일반 왼쪽 값 유형으로 변환되는 경우 조건 연산자의 결과가 lvalue입니다. 그렇지 않으면 결과가 rvalue입니다."

굵게 표시된 비트는 나를 벗어 버립니다. y 및 z는 모두 좌변 타입이다 (물론, Z는 하나가 변환 된 것) int로 변환 될 수 있기 때문에, 예

int main(){ 

    int y = 2; 
    char z = 3; 

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

괜찮을 것 들어 이리에 제안 (오른쪽?) 따라서 조건 연산자는 값의 범주로 lvalue를 부여합니다. 그러나 이것은 실제로 rvalue를 제공하기 때문에 컴파일되지 않습니다. 아무도 굵은 글씨로 언급 된 예외적 인 사례를 제공 할 수 없으므로 어떤 점을 이해할 수 있습니까?

내 이해가 같다 : 표현식이 같은 유형의 lvalues이면 해당 유형의 lvalue가 반환됩니다. 그렇지 않으면 (일부 컴파일러가 결정한 유형의) rvalue가 리턴됩니다.

답변

3

zint으로 변환하면 lvalue-to-rvalue 변환이 이미 적용되고 결과는 lvalue가 아닌 prvalue입니다. 하나이고

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

또 다른 예이다 : 하나 const restrict로이고, 다른 하나는 아닐 경우

일례 두 피연산자는 다른 종류가 있지만, 그 결과는 좌변이다 ?:로이고, 맞춤 전환 연산자를 사용하는 수업 :

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; 
} 
+0

감사합니다. 그것은 최소한 물건을 깨끗이합니다. 나는 마지막 예가 지금 당장 나의 리그에서 조금 벗어나 있다고 생각하지만, 나는 변환 운영자에 대해 더 많이 배울 때 다시 돌아올 것이다. – Silversonic