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?