Ошибка: использование std :: forward в initialize-lists - PullRequest
1 голос
/ 10 октября 2019

Я создаю класс:

#include <iostream>
#include <string>

class Person {
 public:
  template<typename T>
  Person(T&& _name) :
    m_name(std::forward<T>(_name)) {
    }
 private:
  std::string m_name;
};

и вызываю его:

int main(int argc, char const *argv[]) {
  Person p("Nancy");
  return 0;
}

Но компилятор выдает ошибку и много сообщений:

t.cc:8:5: error: no matching constructor for initialization of 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >')
    m_name(std::forward<T>(_name)) {
    ^      ~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

Тип _name является универсальной ссылкой, и я прекрасно пересылаю _name на m_name.

Как я знаю,

, если _name - это l-значение, тип _name будет выводиться как std::string&,

, если _name является значением r, тип _name будет выводиться как std::string&&,

Я инициализирую Person с помощью "Нэнси ", что является r-значением, поэтому оно должно работать нормально, как я знаю.

Я чувствую растерянность.

1 Ответ

3 голосов
/ 10 октября 2019

std::forward функция определена в заголовке utility, поэтому вам не хватает оператора включения:

#include <utility>

Проверьте ссылку .

...