почему компилятор не может связать const int со ссылкой на rvalue? - PullRequest
1 голос
/ 12 апреля 2019

Вот подмножество моего кода.Почему он не может связать const int со ссылкой на rvalue?Я ожидаю, что T будет выведено как int const &, а тип e как int const & && будет сложен в int const &.

template <typename T>
List<T>::List(initializer_list<T> il)
{
    for (T const & i : il) insertAsLast(i);
}

template <typename T>
ListNode<T> * List<T>::insertAsLast(T && e)
{
    ++_size; return trailer->insertAsPrev(std::forward<T>(e));
}

template <typename T>
ListNode<T> * ListNode<T>::insertAsPrev(T && e)
{
    pnode node = new ListNode<T>(std::forward<T>(e), prev, this);
    prev->next = node; prev = node;
    return node;
}

int main()
{
    List<int> l = {1, 3, 2, 1, 34, 5, 2, 34, , 4};
}

Ошибка:

не может связать const int со ссылкой на rvalue

1 Ответ

3 голосов
/ 12 апреля 2019

и тип e int const & && будет сложен до int const &.

Нет, здесь нет ссылка сворачивается . T && становится ссылкой на пересылку только тогда, когда это параметр шаблона шаблона функции, но T представляется параметром шаблона шаблона класса List; тогда T&& это просто ссылка на значение.

Создание шаблона List<T>::insertAsLast решит проблему, но правильное ли это решение зависит от вашего дизайна.

template <typename T>
template <typename X>
ListNode<T> * List<T>::insertAsLast(X && e)
{
    ++_size; return trailer->insertAsPrev(std::forward<X>(e));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...