objeto constexpr con miembro mutable

Se me ocurrió esta clase:

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++;
    }
};

Y aquí está el 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)
}

Preguntas:

Por quéGetX está compilando bien conX+Z como expresión de retorno (Z no es constexpr).Como puedo llamarFoolConst yGetY métodos fuera deconstexpr objeto (pt)?El comportamiento deGetX enmain Es diferente en los compiladores. MSVC compila bien con unint como argumento de plantilla, mientras que GCC (IdeOne) no lo compilará.

Para un compiladorconstexpr GetX Es verdaderoconstexpr, pero para otro no es siX+Z esta involucrado. Si quito+Z y simplementereturn X GCC está bien.

Mi pregunta es muy básica: si el objeto esconstexpr ¿Cómo se puede llamar a un método no constexpr?

Respuestas a la pregunta(3)

Su respuesta a la pregunta