C ++: особенности рассмотрения, но не вызова конструкторов - PullRequest
0 голосов
/ 30 октября 2018

On cppreference о инициализации списка во втором намерении (для копирования-инициализации списка) написано:

copy-list-initialization (рассматриваются как явные, так и не явные конструкторы, но могут вызываться только неявные конструкторы)

В чем разница между конструкторами, которые «рассматриваются» и действительно «называются». Зачем рассматривать конструкторы, которые в любом случае не могут быть вызваны?

1 Ответ

0 голосов
/ 30 октября 2018

Разница между «рассмотренным» и «вызываемым» заключается в том, что «учитывается» означает, что функция-кандидат участвует в разрешении перегрузки, в то время как «вызываемый» означает, что она фактически выбрана в качестве наилучшего соответствия. Явно (каламбур не предназначен), это означает, что если во время инициализации списка копий выбран явный конструктор, это запрещено. Например, рассмотрим этот сценарий:

struct String {
  explicit String(int size);
  String(char const *value);
};

String s = { 0 };

Здесь вы используете неявное преобразование, где явный конструктор будет более подходящим, поэтому компилятор по праву отклоняет его. Вам нужно написать String{ 0 }, чтобы исправить код. Теперь представьте, если явные конструкторы не были рассмотрены, а первый был юридическим кодом. Было бы очень странно иметь явный конструктор, который ничего не делал.

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