Clang (8.0.0) содержит ошибку здесь.
Если вы пишете constexpr auto A = X::A();
и используете case A:
в вашем switch
выражении, вы получаете ту же ошибку компиляции(говоря, что A
не является константным выражением).
Однако, если вы удалите дела, он будет скомпилирован нормально (что означает, что A
является допустимым constexpr
=> противоречием предыдущей ошибке).
Более того, switch(x)
не удается, а switch(this->x)
- успешно.Поскольку x == this->x
в вашем случае, это определенно ошибка.
Как упоминалось в chtz, clang (5/6), кажется, работает просто отлично.Это не аргумент, а очевидная регрессия.
Обновление: Как упоминалось в ОП, они подали отчет об ошибке .