Недавно я начал использовать C++. И у меня есть вопрос о std :: forward с ссылкой lvalue и ссылкой rvalue. В моем понимании, Func (mc) в следующем коде предполагается вызвать Func (T & t) из-за правила вычитания шаблона. И конструктор копирования MyClass должен быть вызван внутри функции с сообщением «конструктор копирования». Однако я не могу получить его, когда запускаю программу. Я проверил, что std :: forwad с ссылкой rvalue и конструктором копий хорошо работает в других строках. Пожалуйста, помогите мне понять, что происходит в коде. Если я сделаю легкую ошибку или недоразумение, я сожалею о том, что уделил вам время. Большое спасибо.std :: конструктор форварда и копирования
class MyClass {
public:
MyClass() { printf("constructor.\n"); };
MyClass(MyClass&) { printf("copy constructor.\n"); };
MyClass(const MyClass&) { printf("const copy constructor.\n"); };
MyClass(MyClass&&) { printf("move constructor.\n"); };
int val = 3;
};
template <typename T>
void Func(T&& t) {
T new_t_(std::forward<T>(t));
new_t_.val *= 2;
};
main() {
MyClass mc;
Func(mc); // lvalue <- Func(T&)
Func(MyClass()); // rsvalue <- Func(T&&)
printf("mc.val=%d\n", mc.val); // this is for check
MyClass mc2(mc); // this is for check of copy constructor
}
Вывода при запуске программы следующего,
constructor.
constructor.
move constructor.
mc.val=6
copy constructor.
Я думаю, что он должен иметь «конструктор копирования» между первым и вторыми «конструкторами» сообщениями.
Еще раз спасибо.
Конструктор 'MyClass (MyClass &)' не очень полезен для многих классов.С шаблоном RAII обычно следует только [Правило пятерки] (http://www.cppsamples.com/common-tasks/rule-of-five.html). – dyp
Спасибо, dyp. Я положил MyClass (MyClass &), чтобы проверить, что этот конструктор копирования не вызывается вместо MyClass (const MyClass &), хотя теперь я знаю, что оба они не вызываются в Func(). – mora