Является ли copy-list-initialization для объекта класса пользовательским преобразованием - PullRequest
0 голосов
/ 26 февраля 2020
#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}; является пользовательским преобразованием или нет?

1 Ответ

0 голосов
/ 28 февраля 2020

Преобразования типов объектов классов могут быть определены конструкторами и функциями преобразования.

Пользовательское преобразование сначала является преобразованием типа. В инициализации Data d = {0}; даже нет преобразования типов, поэтому нет преобразования, определенного пользователем.

...