Как количество фигурных скобок влияет на равномерную инициализацию? - PullRequest
0 голосов
/ 03 февраля 2019

Рассмотрим следующий фрагмент кода:

#include <iostream>

struct A {
  A() {}
  A(const A&) {}
};

struct B {
  B(const A&) {}
};

void f(const A&) { std::cout << "A" << std::endl; }
void f(const B&) { std::cout << "B" << std::endl; }

int main() {
  A a;
  f(   {a}   ); // A
  f(  {{a}}  ); // ambiguous
  f( {{{a}}} ); // B
  f({{{{a}}}}); // no matching function
}

Почему каждый вызов фабрикует соответствующий вывод?Как количество фигурных скобок влияет на равномерную инициализацию?И как все это влияет на скобки?

1 Ответ

0 голосов
/ 03 февраля 2019

Разрешение перегрузки забавно, как это.

  1. {a} имеет точное совпадение ранг для инициализации (временное значение для) *Параметр 1010 *, который выводит пользовательское преобразование B(const A&) как реализацию {a}.Это правило было добавлено в C ++ 14 для устранения неоднозначностей при инициализации списка (вместе с корректировками для агрегатов).

    Обратите внимание, что условное временное значение никогда не создавалось : после выбора разрешения перегрузки f(const A&) ссылка просто инициализируется для ссылки на a, и эта интерпретация может применяться даже для не копируемых типов.

  2. Было бы допустимо инициализировать параметр const A& (как указано выше) для конструктора для либо A или B, поэтому вызов неоднозначен.
  3. Повторный вызов конструктора копирования (здесь A(const A&)) запрещен как многократных пользовательских преобразований - вместо того, чтобы разрешить одно такое преобразование на уровень разрешения перегрузки.Поэтому внешние скобки должны инициализировать B из A, инициализированного из {{a}}, как (разрешено) во втором случае.(Средний слой фигурных скобок может инициализировать B, но копирование его с внешним слоем будет запрещено, и больше ничего не нужно пытаться инициализировать.)
  4. Каждая интерпретация включает в себя такое запрещенное дополнительное преобразование.

Отсутствие скобки - мы не знаем, какой внешний тип цели позволяет это сделать.

...