10 Stimmen

Seltsames constexpr-Verhalten für innere Klasse

Kann mir jemand versuchen, dies zu erklären?

template
struct C
{
};

struct X
{
    enum E { A, B, C };
    static constexpr size_t noElems() { return C+1; };
};

struct K
{
    C cx; // Dieses kompiliert
};

struct Y
{
    struct Z
    {
        enum E { A, B, C };
        static constexpr size_t noElems() { return C+1; };
    };
    C cyz; // Dieses kompiliert

    C cyz; // <--- Dieses kompiliert NICHT 
};

5voto

Rafal Mielniczuk Punkte 1332

Mit der Deklaration des struct

struct Y
{
    struct Z
    {
        enum E { A, B, C };
        static constexpr size_t noElems() { return C+1; };
    };
    C cyz1; // dies KOMPIERT

    C cyz2; // <--- dies KOMPIERT NICHT
};

Die Entitäten cyz1 und cyz2 werden vor der Inline-Deklaration von Z::noElems() geparst, sodass die Definition von

static constexpr size_t noElems() { return C+1; };

nicht zum Zeitpunkt der Deklaration von

C cyz2;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X