В листинге это видно в том числеВ каком?
std::vector<int> operator + (const std::vector<int> &a, const std::vector<int> &b)
{
if(a.size()!=b.size())
{
throw std::range_error("sizes mismatch!");
}
vector<int> result;
result.reserve(a.size());
for(size_t i=0; i < a.size(); ++i)
{
result.push_back(a[i] + b[i]);
}
return result;
}
Почти. Из-за особой магии от virtual при конструкторе копирования, компилятор решает, что функция
push(const T&)
, таки должна быть сгенерирована. И тут они видит в ней ошибку.Ну и что, что вы не требуете выполнения? Вот вы сделайте ваш класс вообще не шаблоном. Или напишите где-то в коде какой-то обычной неиспользуемой функции
asdfhjasdfghjsdfvvhj;
. Компилятор вам ругнется на ошибку в фукнкции. Даже если она не вызывается. Так что тут вам шаблон наоборот иногда даже поблажку дает. Что вас и запутало.Да, в C++ вызов конструктора иногда выглядит как объявление функции. Но по контексту понятно. Вы же не можете объявить функцию в теле функции? Это, все-таки создание list конструктором по умолчанию. Добавтье
cout << "aaa";
в конструктор и убедитесь, что оно вызывается.Можно. Удалите ваш плохой метод push (без перемещения). Он или не будет вообще никак использоватся или вызовет ошибку компиляции. Или меняйте интерфейс так, чтобы push всегда принимал указатель. Ну вы никак не добавите в ваш список неперемещаемый объект, переданный по ссылке (без адских костылей и дикого риска выстрелить себе в ногу).