错误:在初始化列表中使用std :: forward

时间:2019-10-10 09:02:12

标签: c++ forwarding-reference

我创建了一个课程:

#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是左值,则_name的类型将被推断为std::string&

如果_name是r值,则将_name的类型推断为std::string&&

我将Person初始化为r值的“ Nancy”,因此应该可以正常工作。

我很困惑。

1 个答案:

答案 0 :(得分:3)

std::forward函数在utility标头中定义,因此您缺少包含语句:

#include <utility>

检查reference