objeto constexpr com membro mutável

Eu vim com essa classe:

class Point
{
public:
    int X, Y;
    mutable int Z;

    constexpr Point(int x, int y) :X (x), Y(y), Z(0)
    { }

    constexpr int GetX() const
    {
        // Z++; // Wont compile, but following expression is valid!
        return X+Z;
    }

    int GetY() const
    {
        Z++;
        return Y;
    }

    void FoolConst() const
    {
        Z++;
    }
};

E aqui está o uso:

template<int S>
void foo()
{
    std::cout << S << std::endl;
}

int main()
{   
    constexpr Point pt(10, 20);

    pt.FoolConst();

    char arr[pt.GetX()]; // Both compile, but GCC is using extended `new`

    foo<pt.GetX()>(); // GCC fails, VC compiles

    std::cout << sizeof(arr); // 10 (MSVC), 11 (GCC)
    std::cout << pt.GetX();  // 11 (MSVC), 11(GCC)
}

Questões:

Por quêGetX está compilando bem comX+Z como expressão de retorno (Z não é constexpr).Como posso ligarFoolConst eGetY métodos fora deconstexpr objeto (pt)?O comportamento deGetX nomain é diferente nos compiladores. MSVC compila bem com umint como argumento de modelo, enquanto o GCC (IdeOne) não o compilará.

Para um compiladorconstexpr GetX é verdadeiramenteconstexpr, mas para outros não é seX+Z está envolvido. Se eu remover+Z e simplesmentereturn X O GCC está bem.

Minha pergunta é muito básica: se objeto éconstexpr como ele pode chamar um método não constexpr?

questionAnswers(3)

yourAnswerToTheQuestion