#include <iostream>
struct X {
X(std::initializer_list<int> list) { std::cout << "list" << std::endl; }
X(float f) { std::cout << "float" << std::endl; }
};
int main() {
int x { 1.0f };
X a(1); // float (implicit conversion)
X b{1}; // list
X c(1.0f); // float
X d{1.0f}; // list (narrowing conversion) ARG!!!
// warning: narrowing conversion of '1.0e+0f' from 'float' to 'int'
// inside { } [-Wnarrowing]
}
C'è un altro modo di rimuovere std::initializer_list
da un elenco di sovraccarico (vale a dire, rendendo i non-list ctors più favorevole) invece di utilizzare il -initialization(), o meno proibendo che avvenga la conversione del restringimento (oltre a trasformare l'avviso in errore)?Prevenire restringimento di conversione quando si utilizza std :: initializer_list
Stavo usando il compilatore http://coliru.stacked-crooked.com/ che utilizza GCC 4.8.
Buona domanda, +1. Ma è una classe interessante che può essere costruita da una quantità arbitraria di interi o esattamente da un numero in virgola mobile. – Angew
@Angew: eviterei di giudicare i casi di test ridotti troppo avidamente, ad esempio sapevi di [std :: discrete_distribution] (http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution/discrete_distribution)? Non esattamente identico, ovviamente, ma mostra ancora perché potrebbe essere desiderabile. –
Herb Sutter ha coperto questo di recente. Poiché è stata utilizzata l'inizializzazione delle parentesi, è preferibile la versione dell'elenco di inizializzazione. Se si desidera il costruttore float, è necessario utilizzare le parentesi. Vedi esempi (d) e (e) qui: http://herbsutter.com/2013/05/09/gotw-1-solution/ –