У меня есть код здесь:
#include <string>
#include <iostream>
#include <initializer_list>
template <typename T>
class Test
{
public:
Test(std::initializer_list<T> l)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
Test(const Test<T>& copy)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
Test(Test&&) = delete;
Test() = delete;
};
void f(const Test<Test<std::string>>& x)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
void f(const Test<std::string>& x)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
f(Test<Test<std::string>>{x});
}
int main()
{
Test<std::string> t1 {"lol"};
f(t1);
return 0;
}
Я пытаюсь скомпилировать это с GCC 7.3.0 на моем linux mint 19 с помощью команды:
g ++ -std = c ++11 -O0 test.cpp -o test -Wall -pedantic
Компиляция завершается с ошибкой, что этот вызов:
f(Test<Test<std::string>>{x});
Требуется конструктор перемещения, но он удален.Я всегда думал, что конструкторы перемещения и копирования эквивалентны с точки зрения компиляции, потому что rvalue может быть привязано к константной ссылке, но перегрузка с явно определенной ссылкой на rvalue просто имеет приоритет в разрешении перегрузки.Это первый раз, когда я вижу, что компилятору на самом деле требуется конструктор перемещения, и он не просто использует копию.Зачем?Я что-то упустил?