Udostępnij przez


Błąd kompilatora C2797

(Przestarzałe) Inicjowanie listy wewnątrz listy inicjatora składowych lub inicjatora niestacjonalnych elementów członkowskich danych nie jest implementowane.

Uwagi

To ostrzeżenie jest przestarzałe w programie Visual Studio 2015. W programie Visual Studio 2013 i starszych wersjach kompilator języka Microsoft C++ nie implementuje inicjowania listy wewnątrz listy inicjatora składowego ani inicjatora niestacjonowanego elementu członkowskiego. Przed programem Visual Studio 2013 Update 3 został on dyskretnie przekonwertowany na wywołanie funkcji, co może prowadzić do nieprawidłowego generowania kodu. Program Visual Studio 2013 Update 3 zgłasza ten błąd.

Przykłady

W tym przykładzie jest generowany kod C2797:

#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 &)'
};

W tym przykładzie jest również generowany kod 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
};

Aby rozwiązać ten problem, można użyć jawnej konstrukcji list wewnętrznych. Na przykład:

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

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

Jeśli nie potrzebujesz inicjowania listy:

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

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

(Kompilator w programie Visual Studio 2013 wykonuje to niejawnie przed programem Visual Studio 2013 Update 3).