가 나는를 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
을 없애는 데 도움이되는 "더 보편적 인"참조가 있습니까?
'foo'는 매개 변수를 수정하거나 소유권을 가져 오지 않습니다. 'const' 참조를 받아들이는 것으로 선언하십시오. 여기에 전달 참조를 허용 할 이유가 없습니다. – StoryTeller
'std :: tuple && t '는 전달 참조가 아닙니다. –
Holt
@StoryTeller는 실제 코드로 포워딩을 수행하므로 rvalue reference가 필요합니다. 코드 예제를 수정했습니다. – Sergey