Freigeben über


Compilerfehler C2797

(Veraltet) Die Listeninitialisierung innerhalb der Memberinitialisierungsliste oder der nicht statischen Datenmemblerinitialisierung ist nicht implementiert.

Bemerkungen

Diese Warnung ist in Visual Studio 2015 veraltet. In Visual Studio 2013 und früheren Versionen implementiert der Microsoft C++-Compiler keine Listeninitialisierung innerhalb einer Memberinitialisierungsliste oder eines nicht statischen Datenmemblerinitialisierers. Vor dem Visual Studio 2013 Update 3 wurde dies im Hintergrund in einen Funktionsaufruf konvertiert, der zur Generierung von ungültigem Code führen könnte. Visual Studio 2013 Update 3 meldet dies als Fehler.

Examples

In diesem Beispiel wird C2797 generiert:

#include <vector>
struct S {
    S() : v1{1} {} // C2797, VS2013 RTM incorrectly calls 'vector(size_type)'

    std::vector<int> v1;
    std::vector<int> v2{1, 2}; // C2797, VS2013 RTM incorrectly calls 'vector(size_type, const int &)'
};

In diesem Beispiel wird auch die C2797:

struct S1 {
    int i;
};

struct S2 {
    S2() : s1{0} {} // C2797, VS2013 RTM interprets as S2() : s1(0) {} causing C2664
    S1 s1;
    S1 s2{0}; // C2797, VS2013 RTM interprets as S1 s2 = S1(0); causing C2664
};

Um dieses Problem zu beheben, können Sie die explizite Konstruktion von inneren Listen verwendn. Zum Beispiel:

#include <vector>
typedef std::vector<int> Vector;
struct S {
    S() : v1(Vector{1}) {}

    Vector v1;
    Vector v2 = Vector{1, 2};
};

Wenn Sie keine Listen-Initialisierung erfordern:

struct S {
    S() : s1("") {}

    std::string s1;
    std::string s2 = std::string("");
};

(Der Compiler in Visual Studio 2013 Fall vor dem Visual Studio 2013 Update 3 hat dies nur implizit ausgeführt.)