簡單的問題,爲什麼不the following工作(暗示副本ci
)?爲什麼不`const int ci = 2; std ::轉發<int>(ci);`工作以及如何修復/解決方法呢?
#include <utility>
int main(){
const int ci = 2;
std::forward<int>(ci);
}
問題表現出來,而寫一些東西的模板,在那裏我有一個簡單的支架類型,如下所示。爲了避免不必要的副本,我儘可能使用完美的轉發方式,但事實證明這似乎是問題的根源。
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 struct holder {holder(T val):value(std :: move(val)){}};模板持有人 :: type> hold(T val){return holder (std :: move(val)); }(是的,我知道這看起來很混亂:)) –
GManNickG
@GMan:但我不想刪除這個參考。 :( – Xeo
然後你把它叫做'hold(std :: ref(x));':P – GManNickG