, 다음 코드는이 오류의 원인은? here에서 예를 들어 보면&&는 언제 '전달 참조'를 의미합니까?</p> <blockquote> <p>'Container::Wrapper::Wrapper(S)': member function already defined or declared</p> </blockquote> <p>컴파일러가 <code>Wrapper</code>의 생성자에서 <code>S&&</code> 생각 하는가 전달 참조는 다음과 같습니다 컴파일 할 때
는template<typename T>
struct Container
{
template<class S>
struct Wrapper {
S obj;
Wrapper(S&& obj) : obj(std::forward<S>(obj)){}
Wrapper(const S& obj) : obj(obj){}
};
template<class S>
void push_back(S&& obj) {
void *storage = malloc(sizeof(Wrapper<S>));
new (storage) Wrapper<S>(std::forward<S>(obj));
}
};
struct Foobar{};
int main()
{
Container<Foobar> cont;
Foobar foobar;
cont.push_back(foobar);
return 0;
}
, 내가 뭘 내가 뭘하는 어떤 다른 방법을 이해하지 않습니다
template <class T, class Allocator = allocator<T> >
class vector {
public:
...
void push_back(T&& x); // fully specified parameter type ⇒ no type deduction;
... // && ≡ rvalue reference
};
편집 :이 문제에 대한 해결책은에 있었다 push_back
을 수정하여 Wrapper
을 인스턴스화하는 데 사용되는 유형에서 참조를 제거하십시오.
template<class S>
void push_back(S&& obj) {
typedef std::remove_reference<S>::type U;
void *storage = malloc(sizeof(Wrapper<U>));
new (storage) Wrapper<U>(std::forward<S>(obj));
}
"Universal"참조는 * 추론 * 템플릿 매개 변수를 사용해야합니다. –
표준 용어가 이제 _forwarding_ 참조입니다. @KerrekSB 추론 된 '자동'유형 일 수도 있습니다. – KABoissonneault
'Wrapper (S && obj)'의'S'는 생성자를 호출 할 때 오직'Wrapper
'객체를 정의 할 때만 추론됩니다. 따라서 전달 참조가 아닌 rvalue 참조입니다. – KABoissonneault