Разница между «рассмотренным» и «вызываемым» заключается в том, что «учитывается» означает, что функция-кандидат участвует в разрешении перегрузки, в то время как «вызываемый» означает, что она фактически выбрана в качестве наилучшего соответствия. Явно (каламбур не предназначен), это означает, что если во время инициализации списка копий выбран явный конструктор, это запрещено. Например, рассмотрим этот сценарий:
struct String {
explicit String(int size);
String(char const *value);
};
String s = { 0 };
Здесь вы используете неявное преобразование, где явный конструктор будет более подходящим, поэтому компилятор по праву отклоняет его. Вам нужно написать String{ 0 }
, чтобы исправить код. Теперь представьте, если явные конструкторы не были рассмотрены, а первый был юридическим кодом. Было бы очень странно иметь явный конструктор, который ничего не делал.