Перегрузить конструктор класса, который принимает ссылку на rvalue - PullRequest
0 голосов
/ 17 ноября 2018

Я хотел бы сделать что-то вроде следующего:

class Foo
{
    Foo(int &&a, int b, std::string s="");
    // does not compile because a is not an rvalue:
    // Foo(int &&a, std::string s) : Foo(a, 0, s) {}
    Foo(int &&a, std::string s) : Foo(std::move(a), 0, s) {} // move a
}
  • Это допустимый способ перегрузки конструктора в целом?
  • И конкретно тот, который принимает в качестве параметра ссылку на значение r *

Отредактировано на основе комментариев

Чтобы уточнить, я новичок впереместить семантику (и программиста-любителя), и я просто не уверен, что это хороший способ справиться с этой ситуацией.

Я добавил первый вопрос, основываясь на комментарии (теперь удаленном), который предположил, что это не такправильный способ перегрузки конструкторов.

1 Ответ

0 голосов
/ 17 ноября 2018

Это допустимый способ перегрузки конструктора в целом?

А конкретно тот, который принимает в качестве параметра ссылку на rvalue?

В целом допустимо перегрузить конструкторы, даже если они имеют ссылочные аргументы rvalue.

В частности, ваш пример плохо сформирован. Как вы указали в комментариях, пример не компилируется. Чтобы исправить это, вы должны передать rvalue конструктору, которому вы делегируете. Правильный способ преобразования ссылочной переменной rvalue в rvalue - использовать std::move. Итак, что вы должны сделать, это то, что вы уже знаете:

Единственный вариант, который я вижу, это std::move(a).

...