Quando le classi hanno un sovraccarico del costruttore che prende un std::initializer_list
, questo sovraccarico avrà la precedenza anche se altri sovraccarichi del costruttore sono apparentemente una corrispondenza migliore. Questo problema è descritto in dettaglio in Sutter di GotW#1, parte 2, nonché Meyers' Effective Modern C++, punto 7.Come progettare le classi con il costruttore che prende uno std :: initializer_list?
Il classico esempio di dove questo problema si manifesta è quando brace-inizializzazione un std::vector
:
std::vector<int> vec{1, 2};
// Is this a vector with elements {1, 2}, or a vector with a single element 2?
Sia Sutter che Meyers consigliano di evitare progettazioni di classe in cui un sovraccarico del costruttore initializer_list
può causare ambiguità al programmatore.
Sutter:
guida: Quando si progetta una classe, evitare di fornire un costruttore che sovraccarichi ambiguamente con un costruttore initializer_list, in modo che gli utenti non dovranno utilizzare() per raggiungere un tale nascosta costruttore.
Meyers:
Di conseguenza, è meglio per progettare i costruttori in modo che il sovraccarico di chiamato non è influenzato dal fatto che i client utilizzano parentesi graffe o . In altre parole, impara da ciò che viene ora visualizzato come un errore in il design dell'interfaccia std :: vector e progetta le tue classi su evitalo.
Ma nessuno di essi descrivono come vector
avrebbe dovuto essere progettato per evitare il problema!
Quindi, ecco la mia domanda: Come avrebbe dovuto vector
stati progettati per evitare ambiguità con il sovraccarico di costruttore initializer_list
(senza perdere alcuna funzionalità)?
Fantastico! Non ero a conoscenza del fatto che avessero risolto il problema in altre parti della libreria standard. –
Questo approccio ha il vantaggio che i sovraccarichi del costruttore sono utilizzabili sia per l'allocazione di heap che di stack. –
@EmileCormier: è possibile utilizzare questi sovraccarichi per allocazioni heap e stack in un modo o nell'altro ... no? Non riesco a pensare a nulla che lo possa impedire. –