2016-04-06 5 views
1

Ich habe Compiler:
g ++ (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4
Microsoft Visual Studio 2015 ver. 14.0. (Visual C++ 2015)C++ 11 g ++ Fehler: Verwendung von gelöschten Funktion

Quellcode:

#include <queue> 

class C 
{ 
}; 


class B 
{ 
public: 
    // assignment and copy prohibited 
    B(const B&) = delete; 
    B& operator=(const B&) = delete; 

    B(int v1, int v2) : m_V1(v1), m_V2(v2) {} 

private: 
    int m_V1; 
    int m_V2; 
    std::queue<C> m_Queue; 
}; 

class A 
{ 
public: 
    // assignment and copy prohibited 
    A(const A&) = delete; 
    A& operator=(const A&) = delete; 

    A(int p1, int p2) : arrB{ {p1+1, p2+2}, {p1+3, p2+4}, {p1+5, p2+6} } { } 

private: 
    B arrB[3]; 
}; 

1) Wenn ich g ++ mit

std::queue<C> m_Queue; 

bekomme ich folgende Fehlermeldung:

make 
g++ -std=c++11 -c test.cpp 
test.cpp: In constructor ‘A::A(int, int)’: 
test.cpp:29:70: error: use of deleted function ‘B::B(const B&)’ 
    A(int p1, int p2) : arrB{ {p1+1, p2+2}, {p1+3, p2+4}, {p1+5, p2+6} } { } 
                    ^
test.cpp:11:3: error: declared here 
    B(const B&) = delete; 
^
make: *** [test.o] Error 1 

2) Wenn ich Verwenden Sie g ++ und kommentieren Sie die Zeile

//std::queue<C> m_Queue; 

oder ich benutze beide Varianten (kommentiert und nicht) mit Microsoft Visual Studio 2015 Ich bekomme keine Fehler.

Warum?

Update:
List-Initialisierung verwendet Direkt-list-Initialisierung oder Kopieren-list-Initialisierung.

Aber ich verstehe nicht, welche Art von Initialisierung in meinem Fall verwendet werden soll.

8.5.1 Aggregates [dcl.init.aggr]
1 An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order. Each member is copy-initialized from the corresponding initializer-clause.

Ein Aggregat ist ein Array und Jedes Mitglied ist kopier initialisiert - Antwort: Ich nahm an, dass sollte direkt-list-Initialisierung gemäß http://en.cppreference.com/w/cpp/language/list_initialization

Update 2 verwendet werden?
Aber das erklärt nicht, warum kompiliert ohne Fehler, wenn sie auf der Linie Kommentierung:

//std::queue<C> m_Queue; 
+0

Versuchen Sie, die 'std :: queue m_Queue;' als leer mit geschweiften Klammern in 'B's Ctors Initialisierungsliste zu initialisieren. –

+0

g ++ 5.2 lehnt den Code ebenfalls ab, wenn 'm_Queue' vorhanden ist und akzeptiert es, wenn' m_Queue' auskommentiert ist. drang ++ 3.7, wie VC++ 2015, akzeptiert den Code unabhängig. Darüber hinaus kompiliert g ++ den Code, wenn "B" einen Copy-Konstruktor erhält, der eine I-am-seiende Note druckt, und ein Testprogramm zeigt, dass dieser Copy-Konstruktor * nicht in A heißt (int p1, int p2) '. –

+0

@NowhereMan Ich habe es versucht. Es ändert nichts. – Elija

Antwort

0

der Code mit Hilfe des mitgelieferten ich konnte Ihre seltsame Verhalten mit g reproduzieren ++ in Bezug auf die Kommentierung/Auskommentierung der in B. erklärt Warteschlange Ich bekomme den gleichen Fehler in g ++, ob die Warteschlange auskommentiert ist oder nicht.

Der Kompilierungsfehler, den Sie erhalten, ist jedoch der gleiche, den ich in meinem Test des Codes erhalte. Dieser Fehler ergibt sich aus der Tatsache, dass Sie den Kopierkonstruktor von B explizit gelöscht haben. Die Fehlermeldung verweist direkt auf B Copykonstruktor: B(const B&) = delete;

diese Antwort Sehen Sie hier für weitere Informationen: https://stackoverflow.com/a/14543600/1456187

Was den zweiten Teil Ihrer Frage, die ich nur ahne kann, da ich eine Kopie nicht haben der Microsoft Compiler praktisch. Meine beste Vermutung ist, dass der Microsoft Compiler die Initialisierung des Arrays von Bs erlaubt, weil sie an Ort und Stelle konstruiert werden. Dies scheint jedoch der Norm aus der '03-Spezifikation zu widersprechen.

Verwandte Themen