Оператор преобразования в прямой инициализации - PullRequest
6 голосов
/ 20 июня 2019

Стандарт C ++ 14 ( N4296 ) гласит в 8.5 / 17.6.1

Если инициализация является прямой инициализацией [...], рассматриваются конструкторы. Применимые конструкторы перечислены, и лучшие один выбирается через разрешение перегрузки. [...] Если нет конструктора применяется, или разрешение перегрузки неоднозначно, инициализация неверна.

Поэтому при прямой инициализации рассматриваются только конструкторы - функции преобразования игнорируются. В следующем коде нет применимого конструктора A, только функция преобразования из B. Тем не менее, код компилируется, почему?

struct A{};
struct B{
    operator A(){ return A{}; }
};

int main() {
    B b;
    A a(b);  // direct-initialization
}

1 Ответ

7 голосов
/ 20 июня 2019

Вы правы, что при выполнении A a(b); учитываются только конструкторы A. [over.match.ctor] / 1 состояния

Когда объекты типа класса инициализируются напрямую, инициализируются копией из выражения того же или производного типа класса ([dcl.init]) или инициализированное по умолчанию разрешение перегрузки выбирает конструктор.Для прямой инициализации или инициализации по умолчанию, которая не находится в контексте инициализации копирования, все функции-кандидаты являются конструкторами класса инициализируемого объекта. Для инициализации копирования (включая инициализацию по умолчанию вконтексте инициализации копирования), все функции-кандидаты являются конструкторами преобразования ([class.conv.ctor]) этого класса.Список аргументов является списком выражений или выражением присваивания инициализатора.

выделение шахты

Это означает, что A(), A(const A&) иA(A&&) список кандидатов.Тогда у нас есть [over.match.viable] / 4

[...] В-третьих, для того, чтобы F была жизнеспособной функцией, для каждого аргумента должна существовать неявнаяпоследовательность преобразования, которая преобразует этот аргумент в соответствующий параметр F. [..]

, который допускает неявное преобразование b в A, чтобы можно было вызывать A(A&&).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...