2013-06-18 2 views
5

AS3에서 몇 년 후 C++을 다시 배우려고합니다. 참고 문헌은 여전히 ​​나에게 적합합니다.함수의 결과를 참조로 전달할 수 없습니다.

는 다음과 같은 기능을 고려 : 일을 지금

#include <cstdio> 
#include <list> 

void f(std::list<int>& v) { 
    for (std::list<int>::iterator i = v.begin(); i != v.end(); ++i) 
    printf("Hello %d\n", *i); 
} 

std::list<int> get(void) { 
    std::list<int> list; 
    list.push_back(0); 
    return list; 
} 

을 다음

std::list<int> l = get(); 
f(l); 

괜찮지 만, f(get()) 다음과 같은 오류 발생합니다 것을 왜

"no matching function for call to 'f'", "candidate function not viable: no known conversion from `'std::list<int>' to 'std::list<int>&' for 1st argument"

을 ? 함수의 결과가 눈에 보이지 않으므로 const입니까? 이 작업을 수행 할 때

+0

일단 나는 clang의 gcc의 오류 메시지를 선호합니다 : '오류 : '형식의 일시적인'형식의 'std :: list > : list > '' –

답변

8

는 :

f(get()); 

당신은 임시 std::list<int> f()에 전달합니다. 임시는 비 const 참조에 바인드 할 수 없습니다. 따라서 인수를 수정하고 싶지 않으므로 const 참조를 전달하여이 문제를 해결할 수 있습니다. 이것은 당신이 std::list::begin() const와 해당 end() 방법 리턴 const_iterator들 때문에, const_iterator 사용하는 것이 필요하다는

void f(const std::list<int>& v) 
{ // ^^^^^ 
    for (std::list<int>::const_iterator i = v.begin(); i != v.end(); ++i) 
    { //     ^^^^^^^^^^^^^^ 
    printf("Hello %d\n", *i); 
    } 
} 

참고. C++ 11에서는

for (auto i = v.begin(); i != v.end(); ++i) 
    ... 

또는 인수가 T &이기 때문에에도

for (const auto& i : v) 
    std::cout << i << "\n"; 
+1

키워드 : 임시 –

+0

+1 명확한 대답은 –

-1

이를 단순화 할 수 있습니다. 그것은 T 콘 &이었고, 잘 동작했습니다.

일부 오래된 컴파일러는 확장 버전으로 작동합니다. 규칙은 다소 임의적이며 놀랄 일이 아닙니다. T & arg는 OUT (또는 INOUT) 유형을 의미하며, 임시적으로 수정이 끝나는 경우에는 놀랍습니다.

+0

이고 문제는 무엇입니까? –

0

임시 std::list 변수를 get() 메서드에서 반환합니다. 인수가 const이 아니기 때문에 f이 작동하지 않습니다.

관련 문제