Per ulteriori riferimento, alcuni riferimenti specifici al standard sono:
13.3.3 migliore funzione vitale
Data questa definizione, una funzione valida F1 è definita per essere una funzione migliore di un'altra funzione valida F2 se per tutti gli argomenti i, ICSi (F1) non è una sequenza di conversione peggiore di ICSi (F2), e quindi. ..
- F1 non è una specializzazione di modello di funzione e F2 è una specializzazione di modello di funzione ...
In questo caso, la funzione non-templated è (ovviamente) non è un modello di funzione specializzazione e conversione da "Hello World"
a char const*
non è peggiore di a const char[N]
, in base alle regole di classificazione definite nella tabella nella sezione "Sequenze di conversione standard". In base a tale tabella, sia No conversions required
sia Array-to-pointer conversion
sono considerati una corrispondenza esatta nel contesto della risoluzione di sovraccarico. Allo stesso modo, se i sovraccarichi basati su modelli vengono modificati in un overload non di modello (ad esempio, come void assign(const T(&ptr)[12]);
), la compilazione di str.assign("Hello World");
non riuscirà a causa di una chiamata ambigua.
Per assicurarsi che la funzione non-modello non viene presa in considerazione per il sovraccarico, c'è la seguente nota nella sezione "esplicita specificazione modello argomento":
Nota: Un elenco modello di argomenti vuota può essere utilizzato per indicare che un determinato uso fa riferimento a una specializzazione di un modello di funzione anche quando è visibile una funzione non di modello (8.3.5) che altrimenti verrebbe utilizzata.
Quindi, è possibile utilizzare str.assign<>("Hello World");
per quello.
Interessante, non me lo sarei aspettato. Ho fatto un esempio leggermente più complesso qui: http://cpp.sh/7hnfk che concorda con l'asserzione di Microsoft che auto s = "cosa"; genererà un const char * (https://msdn.microsoft.com/en-us/library/69ze775t.aspx) per impostazione predefinita. – Arunas