std :: forward и конструктор с неконстантным ссылочным аргументом

В Краткое введение в ссылки на 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));
}

компилируется. Что я сделал не так?

7
задан T. Bergemann 24 August 2012 в 13:14
поделиться