Для получения дополнительной справки, некоторые конкретные ссылки на Стандарт:
13.3.3 Лучшей жизнеспособная функция
С учетом этих определений жизнеспособная функция F1 определена как лучшая функция, чем другая жизнеспособная функция F2, если для всех аргументов i ICSi (F1) не является худшей последовательностью преобразования, чем ICSi (F2), а затем. ..
- F1 не шаблон функции специализации и F2 шаблон функции специализации ...
В этом случае функция, не шаблонный (очевидно) не шаблон функции специализация и преобразование "Hello World"
в char const*
не хуже, чем const char[N]
, согласно правилам ранжирования, определенным в таблице в разделе «Стандартные последовательности преобразования». Согласно этой таблице, как No conversions required
, так и Array-to-pointer conversion
считаются точными совпадениями в контексте разрешения перегрузки. Аналогично, если шаблонные перегрузки заменяются на не-шаблонную перегрузку (то есть, как void assign(const T(&ptr)[12]);
), то компиляция str.assign("Hello World");
завершится неудачей из-за неоднозначного вызова.
Чтобы убедиться, что функция не-шаблон не рассматриваются для перегрузки, есть следующее примечание в разделе «Явная спецификации аргумента шаблона»:
Примечания: Пустой список аргументов шаблона может быть использован чтобы указать, что данное использование относится к специализации шаблона функции, даже если видна функция без шаблона (8.3.5), которая в противном случае была бы использована.
Для этого вы можете использовать str.assign<>("Hello World");
.
Интересно, я бы этого не ожидал. Я сделал несколько более сложный пример здесь: http://cpp.sh/7hnfk, который согласен с утверждением Microsoft, что auto s = «вещь»; приведет по умолчанию к const char * (https://msdn.microsoft.com/en-us/library/69ze775t.aspx). – Arunas