Было ли это преднамеренно, что шаблон оператора преобразованияT && () - это преобразование в значение? - PullRequest
2 голосов
/ 02 мая 2019

Я писал оператор преобразования, который должен был преобразовать класс в lvalue или rvalue.Поэтому я предположил, что:

struct C
{
    int x;

    template<typename T>
    operator T&&() {
      return std::forward<T>(x);
    }
};

int main() {
  C x;
  int&& rv_i  = std::move(x);
  int   rv_i2 = x;
  //int&  rv_i3 = x; // fails
}

добавил бы оба.Я был удивлен, что вместо этого он добавил только оператор преобразования, который преобразовал в значение типа T.Было ли это преднамеренным по стандарту или это ошибка в g ++, clang ++ и VC ++?

Из-за этого, опять же, требуется дублирование большего количества функций.(

1 Ответ

3 голосов
/ 02 мая 2019

Я думаю, что вы задаете не тот вопрос.

Сначала давайте рассмотрим угол категории значения.Результатом вызова вашего оператора является lvalue, если он возвращает T&, prvalue, если он возвращает T, и xvalue, если он возвращает T&& ( ref ).

Что вы действительно хотите знать, так это то, какой тип возвращает ваш оператор, учитывая использование того, что выглядит как универсальная ссылка.Тем не менее, это не универсальная ссылка.Аргумент функции типа T&& будет универсальной ссылкой, но это не делает тип T&& своего рода волшебным хамелеоном.Здесь вы возвращаете rvalue-ref-to- T, точка.В соответствии с вышеизложенным, это приводит к xvalue (своего рода rvalue).

Теперь, когда мы знаем, что оператор делает то, что должен, как мы можем действовать по-другому?Это действительно зависит от того, что вы пытаетесь достичь, что не было полностью заявлено.Но вполне вероятно, что вы ищете std::move или std::forward.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...