Я создаю класс:
#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-значением, поэтому оно должно работать нормально, как я знаю.
Я чувствую растерянность.