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;
Versuchen Sie, die 'std :: queue m_Queue;' als leer mit geschweiften Klammern in 'B's Ctors Initialisierungsliste zu initialisieren. –
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) '. –
@NowhereMan Ich habe es versucht. Es ändert nichts. – Elija