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

Я немного запутался по поводу инициализации константных ссылок, используя {}.Итак, вот мой код:

#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;
};

int main()
{
  Test<int> t1 {100500};

  //here temporary constructed with copy constructor
  //ref1 bound to temporary
  const auto& ref1 = {t1};

  //no temporary, ref2 bound to t1
  const Test<int>& ref2 = {t1};

  //temporary constructed with copy constructor
  //ref3 bound to temporary
  const Test<int>& ref3 = {{t1}};

  return 0;
}

Источник моего замешательства - другое поведение этих 3 инициализаций.Похоже, они делают разные вещи и следуют другим правилам.Может кто-нибудь уточнить, что именно происходит в каждом случае?

Моя ОС:

Linux Mint 19 Tara

Компилятор:

gcc 7.3.0

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

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

1 Ответ

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

Для const auto& ref1 = {t1}

Выполняется инициализация списка копий, для ref1 выводится тип std::initializer_list<Test<int>>, а в элементах процесса копирования копии для его элементов вызывается Test<int> конструктор копирования.

Примечание : комментарий, содержащийся внутри ref1, может ввести вас в заблуждение, временная привязка к ref1 не относится к типу Test<int>, относится к типу std::initializer_list<Test<int>>.

const Test<int>& ref2 = {t1}

Это в контексте инициализация списка копирования есть специальное правило для привязки ссылки, инициализированной фигурными скобками с одним элементом, привязка ссылки напрямую, временная привязка не введена.

const Test<int>& ref3 = {{t1}}

В этом случае ссылка не привязывается напрямую, {t1} необходимо преобразовать в тип для привязки ссылки, {t1} copy инициализировать временную (вызывается Test<int> конструктор копирования)и этот временный используется для инициализации ref3.

...