Помните о ссылках, rvalue и lvalue, что они являются lvalues. Это означает, что если у вас есть ссылка на вещь, эта ссылка является lvalue, и вам нужно std::move
, чтобы привести ее к rvalue, чтобы ее можно было переместить.
Реальная разница между Myclass (std::vector<int> && in)
и Myclass (std::vector<int> & in)
в том, что с первым вы должны использовать
Myclass A {std::move(orig)};
// or
Myclass A {std::vector(100)};
и не можете передать ему lvalue, где, как и во втором, вы можете использовать только
Myclass A {orig};
, так как он не позволит вам пройти его значение.
Также обратите внимание, что конструктор 3 "неверен". Вы должны использовать std::forward
, только если у вас есть ссылка для пересылки. std::vector<int> && in
является ссылкой на rvalue, а не на переадресацию, поэтому вместо нее следует использовать std::move
. Для правильного использования forward вам понадобится конструктор шаблона, например
template <typename T, std::enable_if_t<
std::is_same<std::decay_t<T>,
std::vector<int>>, bool> = true>
Myclass (T&& in) : vec{std::forward<T>(in)} {};