Недавно начал изучать C++. И у меня есть вопрос по std::forward со ссылкой на lvalue и ссылкой на rvalue. Насколько я понимаю, Func(mc) в следующем коде предполагает вызов Func(T& t) из-за правила вывода параметров шаблона. И конструктор копирования MyClass должен вызываться внутри функции с сообщением «конструктор копирования». Однако я не могу получить его, когда запускаю программу. Я проверил, что std::forwad со ссылкой на rvalue и конструктор копирования хорошо работает в других строках. Пожалуйста, помогите мне понять, что происходит в коде. Если я допускаю легкую ошибку или недопонимание, извините, что отнял у вас время. Большое тебе спасибо.
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 обычно следует только Правило пяти. - person dyp   schedule 06.06.2015