2015-01-07 3 views
5
#include<iostream> 
using namespace std; 

class Test 
{ 
public: 
    Test(){} 
    Test(int param):i(param){} 
    int i; 
}; 

int main() 
{ 

    Test obj1(100); 
    //Test obj2[100](obj1) ; - This doesn't work I know 
    Test obj3[10] = obj1; //This works 
    cout<<obj3[9].i<<endl; 
    return 1; 
} 

Nel codice precedente Test obj2[100](obj1); non funziona, ma Test obj3[10] = obj1;Bad inizializzazione serie vs assegnazione costruttore di copia di inizializzazione

Perché è l'ex supportato, ma quest'ultimo. (Entrambi sarebbero chiamando il costruttore di copia.)

È che il primo non è supportato a causa dei vincoli di implementazione nei compilatori?

Modifica: non sto utilizzando C++ 11. versione gcc 4.8.2 (progetto i686-posix-dwarf-rev3, costruito da MinGW-W64) Qt 5.3.1

Qualsiasi conclusione?

+0

Non funziona perché non è consentito. '()' è inizializzazione del valore a meno che non sia una matrice, quindi il programma è mal formato. –

+0

@Puppy non usa mezzi termini; dicci come ti senti * veramente * sugli array nativi = P – WhozCraig

+0

'Test obj3 [10] = obj1; // Questo funziona '- davvero? clang 3.5 si diffonde ovunque a prescindere dalla modalità (C++ 11 o altro). – WhozCraig

risposta

1

Principalmente sto rispondendo al tuo ultimo commento, perché tutti gli elementi erano già stati forniti nei commenti.

Cosa possiamo vedere:

  • prima sintassi Test obj2[100](obj1); viene rifiutato come errore da tutti i compilatori testati perché ... non segue le specifiche per il linguaggio C++!
  • la seconda sintassi Test obj2[100] = obj1; non sembra adattarsi in modo pulito alle specifiche correnti poiché si inizializza una matrice con un singolo elemento. Più su che:
    • clang (e MSVC) si fronteggiano su di esso: richiedono graffe e poi inizializza solo primo elemento (sarebbe: Test obj2[100] = {obj1};)
    • gcc (4.5 4.9) accetta e inizializza tutti gli elementi di array con una copia di obj1

la mia opinione è che, come è chiaro che sia corretto C++ e in quanto provoca errori su alcuni pesantemente usati compilatori C++, si dovrebbe evitare di utilizzare anche la seconda sintassi, a meno che documentando quello in carattere rosso lampeggiante.

Problemi correlati