완벽한 전달을 시도하면서 템플릿 차감 문제가 발생했습니다. 그것은 내가 템플릿 함수의 서명 const
를 추가하지 않을 경우 동안C++ 11 : 템플릿 공제 및 const 유형
다음은
template<typename T>
void forwarder(T&& x)
{
}
int main()
{
int x = 42;
forwarder(x);
return 0;
}
를 컴파일합니다. forwarder<int&>(x)
내가 유용 할 수 있습니다, 심지어 템플릿에 const
을 추가 생각하지만, 내 : 나는 템플릿 매개 변수로 int&
을 specifiying에 의해 작동시킬 수 g++
test.cc: In function ‘int main()’:
test.cc:11:16: error: cannot bind ‘int’ lvalue to ‘const int&&’
test.cc:4:6: error: initializing argument 1 of ‘void forwarder(const T&&) [with T = int]’
에서
template<typename T>
void forwarder(const T&& x) // adding const here
{
}
int main()
{
int x = 42;
forwarder(x);
return 0;
}
오류 메시지 머리가 아프다.
템플릿 공제에 대한 확실한 이해를 가진 사람이 여기에서 무슨 일이 일어나고 있는지 그리고 템플릿 공제와 함께 const를 사용할 수 있고 실용적인지 여부를 알려줄 수 있습니까?
그냥 궁금해서, 왜 그것이 CONST의 경우를 rvalue (이동) 기준을 만들고있다? 이동 참조의 포인트는 보통 더 이상 사용할 수없는 지점으로 원래의 객체를 변경하는 것입니다. – Julius
여기서 이해할 것은 많지 않습니다 :'T && '에 적용 할 수없는 특별한 규칙이 있습니다 :'T const &&':) In Standardese, 즉 [temp.deduct.call]/3 "'P'가 cv-unqualified 템플릿 매개 변수에 대한 rvalue 참조이고 인수가 lvalue이면에서"lvalue reference to A ""유형이 사용됩니다. 유형 공제를위한 'A'의 장소. " – dyp
이동 참조의 요점은 원래 개체를 더 이상 사용할 수없는 지점으로 변경하는 것입니다. – Julius