Por que esses argumentos padrão são permitidos?
encontreiesta pergunta, e eu estou completamente confuso.
A resposta dizb
é inválido, "Membros não estáticos não podem ser usados como argumentos padrão.". Isso faz todo o sentido.
O que não entendo é por que os outros dois estão bem. Na verdade, estou lutando para entender o que são as semânticas se o padrão não for uma expressão constante ...
Oque esta acontecendo aqui? Os parâmetros padrão são claramente avaliados em tempo de compilação. O compilador simplesmente escolhe o valor atual?
#include <iostream>
int g_x = 44;
struct Foo
{
int m_x;
static int s_x;
Foo(int x) : m_x(x) {}
int a(int x = g_x) { return x + 1; }
int b(int x = m_x) { return x + 1; }
int c(int x = s_x) { return x + 1; }
};
int Foo::s_x = 22;
int main(int argc, char** argv)
{
Foo f(6);
std::cout << f.a() << std::endl;
std::cout << f.b() << std::endl;
std::cout << f.c() << std::endl;
return 0;
}