Этот вопрос является продолжением следующего: Explicit template specialization for templated constructor of templated class Ответы, заданные в другом вопросе, конечно же правильные, но оказалось, что я не совсем спрашивал, что хочу спросить - так вот новый вопрос:Класс с шаблоном конструктором, а также копировать и перемещать конструктор
Рассмотрим следующий код:
template<typename First, typename ... Rest> class var {
public:
var() {
std::cout << "default" << std::endl;
}
var(const var& v) {
std::cout << "copy" << std::endl;
}
var(var&& v) {
std::cout << "move" << std::endl;
}
template<typename T>
var(const T& t) {
std::cout << "general lvalue" << std::endl;
}
template<typename T>
var(T&& t) {
std::cout << "general rvalue" << std::endl;
}
};
int main()
{
var<int> i0; // expect 'default' -> get 'default'
var<int> i1(i0); // expect 'copy' -> get 'general rvalue'
var<int> i2(std::move(i0)); // expect 'move' -> get 'move'
std::string s("Hello");
var<int> i3(s); // expect 'general lvalue' -> get 'general rvalue'
var<int> i4(std::move(s)); // expect 'general rvalue' -> get 'general rvalue'
}
я писал в главной функции, конструкторы я ожидаю и хочу назвать и какие из них на самом деле называется. Вот мои вопросы:
1) Можете ли вы объяснить, почему программа не ведет себя так, как я ожидал?
2) Как я могу заставить программу вызывать копию и перемещать конструктор var, когда он получает var и шаблонные конструкторы в противном случае?
3) И, наконец, я пытаюсь поместить два шаблонных конструктора в одну обработку как lvalues, так и rvalues и перенаправлять их на другую функцию, используя std :: forward - как это могло бы выглядеть?
Большой и очень подробный ответ. Помог мне много! Благодаря! – mg84