Пример кода:
class A
{
static constexpr auto GetInt() noexcept { return 6; }
template<int N>
std::enable_if_t< N >= GetInt(), int> func() { return N; }
};
https://godbolt.org/z/-0pwIQ
Clang и MSVC утверждают, что GetInt()
нельзя использовать, поскольку он не определен в этот момент, однако GCC компилируется без ошибок или предупреждений.
Моя лучшая догадка о том, почему возникает ошибка, состоит в том, что, поскольку класс является неполным в момент, когда func()
, функции-члены считаются неопределенными, и поскольку auto полагается на определение функции для определения возвращаемого типа, компилятор может: использовать его для генерации сигнатуры функции.
Однако это не объясняет, почему GCC это позволяет. Это неверно?