2012-06-29 5 views
0

의 순서 답변으로 What is the correct answer for cout << c++ << c;?운영자 << - -이 질문 &에서 매개 변수 평가

내가 얻을

std::cout<<c++<<c; 

평가된다 두 매개 변수 중 하나를 먼저 평가할 수 있다는 사실. 여태까지는 그런대로 잘됐다.

하지만 왜 std::operator <<? std::ostream::operator <<은 왜 호출되지 않습니까?

struct A 
{ 
    A& foo(); 
    void goo(); 
}; 
//... 
A a; 
a.foo().goo(); 

:이 경우, 그것은

(ofstream::operator<<(c++)) << c; 
       | 
    returns ofstream& 

이 및 방법 체인의 차이점은 무엇으로 번역 할 것인가?

+2

별로 차이는 없습니다. 'a.foo (C++). goo (c)'를하면 같은 문제가 다시 발생합니다. –

답변

3

std::ostream은 과부하 멤버 연산자로 operator<<을 제공하지만 다른 헤더 (예 : <string>)는 무료 연산자를 제공합니다. 따라서 <<이 멤버 연산자인지 또는 자유 함수인지 여부는 RHS 유형에 따라 다릅니다.

그러나 어느 쪽이든 상관 없습니다. 이제 <<foo로하고 coutbar로 이름을 변경하자 동작이 정의되지 않은 두 경우 모두

foo(foo(bar, c++), c); 
bar.foo(c++).foo(c); 

을 특정 순서로 foo에 전화 중 하나에 인수를 평가하기 위해 구현에 아무런 요구 사항이 없기 때문입니다. 중요한 고려 사항은 부속서 C에 따라 체인화 된 메소드 호출이 하나 이상의 전체 표현을 구성하지 않는다는 것입니다. 컴파일러는

foo.bar(<some-complex-expression>).baz(<another-complex-expression>); 

가 보는 경우는 barbaz에 인수에 CSE 및 재정렬을 적용하는 무료입니다; 참으로 부작용의 조사는 에 그들의 앞에 baz에 논쟁이 평가 된 ㄴ다는 것을 보여줄지도 모른다.

struct A { A &foo(int) { return *this; } }; 
#include <cstdio> 
int main() { A().foo(printf("hello\n")).foo(printf("bye\n")); } 

제 컴파일러 (GCC 4.1.2) bye\nhello\n를 출력하는 프로그램을 생성한다.

+1

첫 번째 문장이 올바르지 않습니다. [인수 유형] (http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt) –

+0

@JesseGood 감사합니다. – ecatmur

관련 문제