1) , , ?
:
var<int> i1(i0); // expect 'copy' -> get 'general rvalue'
var(T&&) T, var<int>&, .. :
var(var&);
, var(const var&), i0 .
:
var<int> i3(s); // expect 'general lvalue' -> get 'general rvalue'
s const, var(T&&) T, std::string&, :
var(std::string&);
non-const , :
var(const std::string&);
, var(T&&) " rvalue", T&& , lvalues.
. ++ 11.
2) var, var ?
, .
template<typename T>
using Is_a_var = std::is_same<typename std::decay<T>::type, var>;
template<typename T>
using Enable_if_not_a_var = typename std::enable_if<!Is_a_var<T>::value>::type;
template<typename T, typename Constraint = Enable_if_not_a_var<T>>
var(T&& t) {
std::cout << "general value" << std::endl;
}
copy/move , , :
var(const var&) = default;
var(var&&) = default;
3) , , lvalues, rvalues , std:: forward - ?
. var(T&&) rvalues lvalues.
std:forward<T>(t) :
template<typename T, typename Constraint = Enable_if_not_a_var<T>>
var(T&& t) : m_something(std::forward<T>(t)) {
std::cout << "general value" << std::endl;
}