Здесь у меня есть некоторый код:
#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() = delete;
Test(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({x});
}
int main()
{
Test<std::string> t1 {"lol"};
f(t1);
return 0;
}
Проблема здесь в том, что я хотел вызвать перегрузку void f(const Test<Test<std::string>>& x)
здесь:
f({x});
Я знаю, что если я назову это какэто:
f(Test<Test<std::string>>{x});
Это сделает работу.
Я просто не совсем понимаю, что происходит с точки зрения компиляции в первом случае.
Я думал, что строка f({x})
должна:
- Создать временный объект
Test<std::string>
. - Привязать аргумент const reference к этому объекту.
- Рекурсия продолжается и перейти к шагу 1.
Вместо этого он просто пропускает один и тот же исходный объект снова и снова, и временные файлы не создаются.,Это как x
так же, как {x}
.Почему компилятор так себя ведет?
Моя ОС:
Linux Mint 19 Tara
Компилятор:
gcc 7.3.0
Команда компиляции:
g ++ -std = c ++ 11 -O0 test.cpp -o test -Wall -pedantic