В Краткое введение в ссылки на Rvalue идеальная пересылка предлагается как идеальное решение для пересылки rvalue 5 конструктору с неконстантным ссылочным аргументом.
Но:
#include <memory>
#include <iostream>
#include <utility>
template <class T, class A1>
std::shared_ptr<T> factory(A1&& a1) {
return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}
class X {
public:
X(int& i){
std::cout<<"X("<<i<<")\n";
}
};
int main() {
std::shared_ptr<X> p = factory<X>(5);
}
не работает в XCode 4.2 и G ++ 4.6.1 с без известного преобразования из int в int &
, тогда как:
template <class T, class A1>
std::shared_ptr<T> factory(A1&& a1) {
return std::shared_ptr<T>(new T(/*no forwarding*/a1));
}
компилируется. Что я сделал не так?