2015-10-01 14 views
15

Si consideri il seguente programma:Qual è il significato di ellissi in un costruttore di copie?

#include <iostream> 
struct Test 
{ 
    int a; 
    Test() : a(3) 
    { } 
    Test(const Test& t...) 
    { 
     std::cout<<"Copy constructor called\n"; 
     a=t.a; 
    } 
    int get_a() 
    { 
     return a; 
    } 
    ~Test() 
    { 
     std::cout<<"Destructor is called\n"; 
    } 
}; 
int main() 
{ 
    Test t; 
    Test* t1=new Test(t); 
    std::cout<<t.get_a()<<'\n'; 
    std::cout<<t1->get_a()<<'\n'; 
    delete t1; 
} 

osservare da vicino i tre punti nel parametro del costruttore di copia sono rimasto davvero sorpreso quando ho provato questo programma. A che cosa serve? Cosa significa?

Che cosa dice la specifica della lingua a riguardo?

So che tre punti sono utilizzati per rappresentare argomenti di lunghezza variabile nelle funzioni variadic come printf() e scanf() ecc e anche le macro variadic introdotte dal C99. In C++, se non sbaglio, sono usati nei modelli variadici.
Questo codice è ben formato? Questo costruttore di copie varia può prendere qualsiasi numero di argomenti?

Compila & eseguito bene su g ++ 4.8.1 & MSVS 2010.

+6

Uguale a 'Test (const Test & t, ...)' (nota la virgola) –

+1

Qualsiasi costruttore che può essere chiamato con un valore del tipo in sé e lo prende per riferimento è un possibile costruttore di copia. Il fatto che ulteriori argomenti opzionali possano essere forniti è irrilevante. –

+4

@PiotrSkotnicki: Quindi, perché la virgola non è necessaria? – Destructor

risposta

5

Il progetto di norma nella sezione 8.3.5[dcl.fct] dice , ... è sinonimo di ... meno ... fa parte di astratto-dichiaratore (sottolineatura mia):

[...] Se il parametro-dichiarazione-clausola termina con i puntini di sospensione o un divertimento ction parameter pack (14.5.3), il numero di argomenti deve essere uguale o maggiore del numero di parametri che non hanno un argomento predefinito e non sono pacchetti di parametri di funzione. Dove sintatticamente corretta e dove “...” non è parte di un astratto-dichiaratore, “...” è sinonimo di “...”. [...]

Così si tratta di un variadic function e, per quanto posso dire, senza argomenti aggiuntivi questo è anche un costruttore di copia valida, dalla sezione 12.8[class.copy]:

un costruttore non template per la classe X è una copia costruttore se il suo primo parametro è di tipo pe X &, const X &, volatile X & o const volatile X & e non ci sono altri parametri oppure tutti gli altri parametri hanno argomenti predefiniti (8.3.6).

e questa nota dice che le ellissi non sono parametri:

void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow 
         // a parameter with a default argument 

che è sostenuta dal testo normativo di sopra del quale dice:

Se il parametro dichiarazione -clause termina con un'ellissi [...]

nota, da quando è stato chiesto un astratto-dichiaratore è un dichiaratore, senza un identificatore.

+0

Nota la prima regola che cito è ciò che consente i [famigerati sei punti] (http://stackoverflow.com/a/33502576/1708801). –

5

A cosa serve? Cosa significa?

Sì, introduce una funzione variadica.

In C++ Se non sbaglio vengono utilizzati nei modelli variadici.

La sintassi e la semantica sono differenti. È una funzione variadica in stile "C", non una variabile modello. Inoltre, un costruttore di copie non può essere una funzione modello.

A non-modello costruttore per la classe X è un costruttore copia se prima parametro è di tipo X &, const X &, volatile X & o const volatili X &, e sia non ci sono altri parametri oppure tutti gli altri parametri hanno argomenti predefiniti (8.3.6).

Per §12.8.2 nella bozza finale (sottolineatura mia)

È questo il codice ben formata? Questo costruttore di copie varia può prendere qualsiasi numero di argomenti?

Se i puntini di sospensione contengono parametri, non è più un costruttore di copie ma un semplice costruttore. Se non ci sono, allora è un costruttore di copia valido.

X(const X&, int = 1, double = 5); // copy-ctor 
X(const X&, int = 1, double); // constructor 
+0

Quindi posso dire che il progamma in questo collegamento non ha costrctor di copia perché non usa argomenti predefiniti. http://ideone.com/VuNTU5 – Destructor

+1

@PravasiMeet Right. – edmz

Problemi correlati