我创建一个类:

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

我用r值的“Nancy”初始化Person,所以应该可以正常工作。

我感到困惑。

最佳答案

std::forward header 中定义了utility函数,因此您缺少include语句:

#include <utility>

检查reference

关于c++ - 错误:在初始化列表中使用std::forward,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58319167/

10-11 22:33
查看更多