コンパイルすると、次のコードは、このエラーが発生します。&&の意味はいつも '転送参照'ですか?
'Container::Wrapper::Wrapper(S)': member function already defined or declared
は、コンパイラがWrapper
のコンストラクタでS&&
が転送リファレンスだと思いますか? hereからの例を見てみると
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それは、推測された 'auto'型でもあります。 – KABoissonneault
'Wrapper(S && obj)'の 'S'は、' Wrapper
'というオブジェクトを定義するときにのみ、コンストラクタの呼び出し時に導かれません。したがって、これは正参照であり、転送参照ではありません。 – KABoissonneault