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

questionAnswers(3)

yourAnswerToTheQuestion