Перегрузка функции C ++ и конструктор initializer_list - PullRequest
0 голосов
/ 14 декабря 2018

Здесь у меня есть некоторый код:

#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}) должна:

  1. Создать временный объект Test<std::string>.
  2. Привязать аргумент const reference к этому объекту.
  3. Рекурсия продолжается и перейти к шагу 1.

Вместо этого он просто пропускает один и тот же исходный объект снова и снова, и временные файлы не создаются.,Это как x так же, как {x}.Почему компилятор так себя ведет?

Моя ОС:

Linux Mint 19 Tara

Компилятор:

gcc 7.3.0

Команда компиляции:

g ++ -std = c ++ 11 -O0 test.cpp -o test -Wall -pedantic

1 Ответ

0 голосов
/ 14 декабря 2018

Я думал, что строка f ({x}) должна:
- Создать временный объект Test

Ваша ошибка,

{x} построить const Test<std::string>& от x (личность).

Поскольку 2 кандидата:

  • void f(const Test<Test<std::string>>&) # 1
  • void f(const Test<std::string>&) # 2

overload_resolution сложны, но в настоящее время # 2 является лучшим соответствием (точное совпадение).

#1

...