Как кажется, консенсус уже есть: да, вы правы.
Но так как этот вопрос / ответы, вероятно, станут отправной точкой для неявных преобразований C ++ в stackoverflow, я хотел бы добавить, что для аргументов шаблона правила отличаются.
Неявные преобразования не допускаются для аргументов, которые используются для вывода аргументов шаблона. Это может показаться довольно очевидным, но, тем не менее, может привести к тонкой странности.
Пример: операторы сложения std :: string
std::string s;
s += 67; // (1)
s = s + 67; // (2)
(1) компилируется и работает нормально, operator+=
- функция-член, символьный параметр шаблона уже определяется путем создания экземпляра std::string
для s (до char
). Поэтому допускаются неявные преобразования (int
-> char
), в результате s содержит символ, эквивалентный 67, например в ASCII это станет 'C'
(2) выдает ошибку компилятора, так как operator+
объявлен как свободная функция, и здесь аргумент символа шаблона - это , используемый для вывода.