Verhinderung der Verengung der Konvertierung bei Verwendung von std :: initializer_list

#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]
}

Gibt es eine andere Möglichkeit zum Entfernenstd::initializer_list aus einer Überladungsliste (d. h. die Nichtlisten-Ctoren günstiger zu machen), anstatt die () -Initialisierung zu verwenden, oder zumindest zu verhindern, dass eine Verengungskonvertierung stattfindet (abgesehen davon, dass Warnung in Fehler umgewandelt wird)?

Ich habe benutzthttp://coliru.stacked-crooked.com/ Compiler, der GCC 4.8 verwendet.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage