Простой вопрос: почему следующее не работает (подразумевая копию ci
)?
#include <utility>
int main(){
const int ci = 2;
std::forward<int>(ci);
}
prog.cpp: в функции 'int main()':
prog.cpp:6:23: ошибка: нет соответствующей функции для вызова 'forward(const int&)'
Проблема проявилась при написании некоторых шаблонных вещей, где у меня есть простой тип держателя следующим образом. Чтобы избежать ненужных копий, я использую идеальную пересылку, где это возможно, но, похоже, это и есть корень проблемы.
template<class T>
struct holder{
T value;
holder(T&& val)
: value(std::forward<T>(val))
{}
};
template<class T>
holder<T> hold(T&& val){
// T will be deduced as int, because literal `5` is a prvalue
// which can be bound to `int&&`
return holder<T>(std::forward<T>(val));
}
template<class T>
void foo(holder<T> const& h)
{
std::tuple<T> t; // contrived, actual function takes more parameters
std::get<0>(t) = std::forward<T>(h.value); // h.value is `const T`
}
int main(){
foo(hold(5));
}
Если потребуется какая-либо дополнительная информация, сообщите мне об этом.
Мы будем очень признательны за любую идею, позволяющую обойти эту проблему.
template <class T> struct holder { holder(T val) : value(std::move(val)){} }; template <class T> holder<typename std::remove_reference<T>::type> hold(T val) { return holder<T>(std::move(val)); }
(Да, я знаю, что это выглядит беспорядочно. :)) - person GManNickG   schedule 27.11.2011hold(std::ref(x));
. :П - person GManNickG   schedule 27.11.2011void foo(param_pack<int,int> p){...} /*...*/ foo((_2 = some_var, _1 = 1));
. Надуманный пример, но он должен передать мои намерения. К сожалению, я сталкиваюсь с проблемой после проблемы с этим. :( Теперь это ссылки, которые ломаются при попытке их переместить: ideone.com/Vx0Jp - person Xeo   schedule 27.11.2011