#include <iostream>
struct Data{
Data(int){
}
}
int main(){
Data d = {0}; //#1
}
Как показывает приведенный выше код: содержит ли вызов # 1 преобразование, определенное пользователем? В моем понимании стандарта, я думаю, что он не
Для правил копирования списка инициализации [ dcl.init.list]
В противном случае, если T является типом класса, учитываются конструкторы. Применимые конструкторы перечисляются, и лучший выбирается через разрешение перегрузки ([over.match], [over.match.list]). Если для преобразования какого-либо из аргументов требуется сужающее преобразование (см. Ниже), программа некорректна
[over.match.list]
Если жизнеспособный конструктор списка инициализаторов не найден, разрешение перегрузки выполняется снова, где все функции-кандидаты являются конструкторами класса T, а список аргументов состоит из элементов списка инициализатора
Стандарт только говорит, что конструктор наилучшего соответствия используется для инициализации объекта, который инициализируется с помощью элемента initializer list
, он отличается от инициализации копирования (инициализация копирования говорит, что " определяется пользователем последовательности преобразования, которые могут преобразовывать из исходного типа в тип назначения ", явно определить, что для инициализации копирования требуется пользовательское преобразование)
Итак Data d = {0}; => Data d(0);
нет другого пользовательского преобразования, кроме стандартных преобразований? мое понимание верно?
Однако другие термины [class.conv]
Преобразования типов объектов класса могут быть определены конструкторами и функциями преобразования. Эти преобразования называются пользовательскими преобразованиями и используются для неявных преобразований типов (пункт [conv]), для инициализации и для явных преобразований типов
вышеуказанный термин означает, что инициализированный тип назначения является классом введите и нужно использовать конструкторы или функции преобразования, тогда преобразования являются «пользовательскими преобразованиями»
Я смущен этими терминами, что на самом деле Data d = {0};
является пользовательским преобразованием или нет?