2013-02-27 5 views
9
  • 목록의 end()은 과거의 이터레이터 사본을 반환합니다. 맞습니까?
  • 그러므로 list.end()은 가치가 있습니다. 맞습니까?
  • 리스트 iterator에 대해 오버로드 된 - 연산자 - 함수가 비 const 참조를 사용합니다. 맞습니까?
  • rvalues를 const가 아닌 참조에 바인딩 할 수 없습니까?

는 어떻게왜 --list.end()가 컴파일됩니까?

std::list<int> lst; 
// ... 
--l.end();` 

컴파일 않는 오지?

정확하게 지적했듯이, 세 번째 요점은 꼭 맞는 것은 아닙니다. 그렇다면 컴파일 된이 코드는 어떻습니까?

struct A{}; 

void f(A&) 
{ 

} 
A a() 
{ 
    return A(); 
} 

int main() 
{ 
    f(a()); 
} 
+2

세 번째 요점은 잘못되었습니다. – Nawaz

+0

@banuj : 이해가 안됩니다. –

+0

두 번째 예제가 컴파일됩니다. http://ideone.com/V98wW3 –

답변

12
  • 더 -리스트 반복자 과부하 연산자 기능 바로 비 CONST 참조 소요?

이 점은 잘못되었습니다. operator--은 멤버 함수이며 멤버 함수는 임시로 호출 할 수 있습니다. 이 멤버 함수에는 어떤 객체도 인수로 넘겨주지 않습니다. rvalue를 비 const 레퍼런스에 바인딩하는 문제는 처음에는 발생하지 않는다. 편집에 관해서는


( 를 rvalue f(A&){}- 전달), 그것은 비표준 확장입니다. 내가 같아요. 제 생각에는 어리석은 비표준 확장자를 가지고 있기 때문에 Microsoft 컴파일러를 사용하고 있습니다.

+0

아 ... 맞아. 나는 바보 야. 논리의 resto는 소리 thouhg이다, 그렇지? :) –

+0

Btw, 표준 위임 사항을 수행합니까? 아니면 구현 정의입니까? –

+0

실제로 반드시 멤버 함수는 아닙니다. 이터레이터는 포인터 일 수 있습니다. –