2016-12-19 1 views
2

가 나는를 rvalue 참조 허용하는 기능이 있습니다 좌변 참조 받아를 rvalue 참조로 const를 좌변 참조를 전달

template<typename... Ts> 
void foo(std::tuple<Ts...>&& t) 
{ 
    processFoo(std::forward<std::tuple<Ts...>>(t)); 
} 

다른 기능 :

template<typename T> 
void bar(const T& t); 

을 나는 bar이 할 수 있도록하려면 lvalues와 rvalues ​​둘 다로 바인딩하기 때문에 서명은 괜찮습니다. 그런 다음 에 t으로 전화하고 싶습니다. 이 코드의 경우 :

template<typename T> 
void bar(const T& t); 
{ 
    foo(t); 
} 

내 컴파일러는 정당하게 호환되지 않는 이력서 - 예선을 std::tuple<_blahblahblah>로하고 const std::tuple<_blah>, foo(...)에 호출 일치하는 기능이 없음을 뿌려줍니다.

template<typename T> 
void bar(const T& t); 
{ 
    foo(std::forward<T>(const_cast<T&>(t))); 
} 

하지만 const_cast은 해결과 같다 : 그래서 다음을 수행합니다!

위의 전달 코드는 정상적으로 보이며 관용적입니까? 아마도 다른 참조 유형과 cv-qualifier에 대해 foo을 오버로드하는 것이 더 좋을까요? 또는 const_cast을 없애는 데 도움이되는 "더 보편적 인"참조가 있습니까?

+2

'foo'는 매개 변수를 수정하거나 소유권을 가져 오지 않습니다. 'const' 참조를 받아들이는 것으로 선언하십시오. 여기에 전달 참조를 허용 할 이유가 없습니다. – StoryTeller

+1

'std :: tuple && t '는 전달 참조가 아닙니다. – Holt

+0

@StoryTeller는 실제 코드로 포워딩을 수행하므로 rvalue reference가 필요합니다. 코드 예제를 수정했습니다. – Sergey

답변

4

std::tuple<Ts...> &&하지 전달 참조되기 전에, 그것은 단순한를 rvalue 참조입니다 작동하지 않을 수 있습니다 당신은 const를 좌변-REF를 rvalue-REF에 바인딩 할 수없는 -에 코드를 변경합니다

template<typename Tuple> 
void foo(Tuple&& t) { 
    processFoo(std::forward<Tuple>(t)); 
} 

그러면 실제 전달 참조가 생겨 코드가 작동합니다.

+0

합리적으로 보입니다. 감사! – Sergey