Мне сложно понять, почему мой код не компилируется здесь.Я получаю много сообщений об ошибках из стандартной библиотеки в соответствии с
main3.cpp:10:20: required from ‘void addAndCout(T&&) [with T = const char (&)[11]]’
main3.cpp:20:28: required from here
/usr/include/c++/5/bits/alloc_traits.h:450:27: error: forming pointer to reference type ‘const char (&)[11]’
using pointer = _Tp*;
^
/usr/include/c++/5/bits/alloc_traits.h:453:39: error: forming pointer to reference type ‘const char (&)[11]’
using const_pointer = const _Tp*;
Это не имеет смысла для меня, так как я думал, что T &&, когда T не был выведен, является универсальнымссылка, которая должна быть в состоянии связать с rvalue или lvalue.В этом примере я пытаюсь скопировать раздел из «Эффективного современного C ++» Скотта Мейера, где я читал об универсальных ссылках. Фотография примера из книги
Мне просто интересно, почему это не скомпилируется или что мне здесь не хватает, поскольку, насколько я могу судить, это фактически то же самое дляпример.
#include <iostream>
#include <vector>
#include <string>
using std::cout;
using std::endl;
template<typename T>
void addAndCout(T &&name)
{
std::vector<T> v;
cout << name << endl;
v.emplace_back(std::forward<T>(name));
}
int main(int argc, char **argv)
{
std::string name {"test"};
addAndCout(std::string("rvalue")); // FINE move rvalue instead of copying it
addAndCout("New string"); // ERROR make a new string instead of copying
addAndCout(name); // ERROR copy lvalue
}