Ответ 1
О, это противно.
Per [over.ics.list] p4 и p7:
4 В противном случае, если параметр является неагрегатным классом
X
, а разрешение перегрузки на 13.3.1.7 выбирает один лучший конструкторX
для выполнения инициализации объекта типаX
из инициализатора аргумента список, неявная последовательность преобразования представляет собой пользовательскую последовательность преобразований со второй стандартной последовательностью преобразования, которая преобразует идентичность. [...][...]
6 В противном случае, если параметр является ссылкой, см. 13.3.3.1.4. [Примечание. Правила в этом разделе будут применяться для инициализации базового временного кода для ссылки. - конец примечания] [...]
[...]
7 В противном случае, если тип параметра не является классом:
[...]
(7.2) - если в списке инициализаторов нет элементов, неявная последовательность преобразования - это преобразование идентичности. [...]
Конструкция a const std::pair<int,int>
временная из {}
считается определяемой пользователем конверсией. Конструкция const std::pair<int,int> *
prvalue или const int *
prvalue или временного объекта const int
считаются стандартными преобразованиями.
Стандартные преобразования предпочтительнее, чем пользовательские преобразования.
Ваша собственная находка Вопрос CWG 1536 имеет значение, но в основном для юристов языка. Это пробел в формулировке, где стандарт на самом деле не говорит, что происходит для инициализации ссылочного параметра из {}
, так как {}
не является выражением. Это не то, что делает один вызов двусмысленным, а другой - тем не менее, и реализации могут использовать здесь здравый смысл.