2014-06-24 4 views
5

Zum Beispiel habe ich eine KlasseWie wird die Initialisiererliste implizit in die Klasse konvertiert?

struct A 
{ 
    A(int i, double d) {...} 

private: 
    int m_i; 
    double m_d; 
}; 

und eine Funktion mit einem Argument A

void f(A a); 

Und ich kann Initialisiererliste rufen Sie die Funktion

f(A{1, 3.14}); 

Wie verwenden zu machen Die folgende einfache Version funktioniert auch?

f({1, 3.14}); 
+4

Doing 'A {...}' verwendet keine Initialisierungsliste, es ist [einheitliche Initialisierung] (http://en.wikipedia.org/wiki/C++11#Uniform_initialization) und ist das gleiche wie 'A (...)'. –

Antwort

6

Der Aufruf der Funktion mit der Initialisierungsliste funktioniert. Sie sollten nichts besonderes tun. :)

Der Aufruf würde nicht kompiliert werden, wenn der Konstruktor den Funktionsbezeichner explicit hätte. In diesem Fall müssen Sie den vorherigen Aufruf der Funktion auf ein Objekt vom Typ A.

+0

Was, wenn wir eine andere Überladung dieser Funktion haben, die ein anderes Objekt mit demselben Konstruktor akzeptiert? https://ideone.com/iN0uKW – Omid

+0

@xyz Es wird eine Mehrdeutigkeit geben. –

+0

ja ich weiß, es ist komisch, dass sogar die explizite Erstellung eines Konstruktors nicht funktioniert https://ideone.com/uFif5G – Omid

0

f(A{1, 3.14}); 

mit Hilfe der funktionellen Notation von Gießen der Initialisiererliste verwenden Wenn Sie mehrere Überlastung einer Funktion haben, die Objekte übernehmen mit dem gleichen Konstruktor und Sie wollen f({1, 3.14}); Anruf einer von ihnen

Es ist möglich, mit einigen Meta-Programmierung

#include <string> 
#include <type_traits> 
#include <iostream> 

struct A{ 
    A(int ,double) {} 
}; 

struct B{ 
    B(int ,double) {} 
}; 

template<class T=A> 
void f(T a, 
     typename std::enable_if<std::is_same<T,A>::value>::type* = 0){ 
    std::cout<<"In f(A a)\n"; 
} 

void f(B b){std::cout<<"In f(B b)\n";} 

int main(int argc, char**argv) 
{ 
    f({1,2}); //It's not ambiguity anymore and calls f(B a) 
    f(A{1,2});//call f(A a) 
    f(B{1,2});//call f(B b) 
    //f(2); error 
} 

live

Verwandte Themen