Я пытаюсь понять, как идеальные экспедиторскую работу, но я не могу понять, почему конструктор копии вызывается в коде нижеНе может понять, почему совершенная пересылка не работает
#include <utility>
#include <iostream>
using std::cout;
using std::endl;
class Something {
public:
Something() = default;
Something(__attribute__((unused)) const Something& other) {
cout << "Copy constructor called" << endl;
}
Something(__attribute__((unused)) Something&& other) {
cout << "Move constructor called" << endl;
}
void print() {
cout << "Something::print() called" << endl;
}
};
void function_1(Something&& one) {
cout << "version two called" << endl;
Something inner{one};
inner.print();
}
void function_1(const Something& one) {
Something inner(one);
inner.print();
}
template <typename... T>
void test_function(T&&... ts) {
function_1(std::forward<T>(ts)...);
}
int main() {
const Something some1 {Something()};
test_function(some1);
test_function(Something());
return 0;
}
Это производит следующий вывод
Copy constructor called
Something::print() called
version two called
Copy constructor called
Something::print() called
Изменение кода для включения std::move
в справочной системе rvalue работает, но я не ожидал, что это понадобится. Когда ссылка является ссылкой rvalue, правильный конструктор следует вызывать автоматически правильно? Правильная ссылка разрешена, но вызывается неправильный конструктор. Любая помощь будет принята с благодарностью!
Это должно быть легко понять: просто установите точку останова на конструкторе, и когда вы нажмете на нее, backtrace расскажет вам, как он вызван. Это одна из самых простых проблем, которые могут быть решены с помощью отладчика. –
@SamVarshavchik Я понимаю, как его вызывают, но вызывает неправильную перегрузку! – Curious
Что вы скажете? Вы знаете, что вам нужно явно использовать std :: move(), чтобы сохранить семантику ссылки rvalue, правильно? –