Почему GCC допускает выводимый тип возвращаемого значения в этом шаблоне функции, а MSVC и Clang - нет?

Пример кода:

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 это разрешает. Это неправильно?


person Tharwen    schedule 10.07.2019    source источник
comment
Я считаю, что код правильный.   -  person L. F.    schedule 10.07.2019
comment
Не могу вспомнить точно, но выведенные типы возврата не подходят для SFINAE ...   -  person Jean-Baptiste Yunès    schedule 10.07.2019
comment
Определения функций обрабатываются в конце определения класса, поэтому при синтаксическом анализе шаблона тип возвращаемого значения фактически неизвестен ...   -  person Jean-Baptiste Yunès    schedule 10.07.2019
comment
@ Jean-BaptisteYunès Значит, GCC должен его отклонить?   -  person Tharwen    schedule 10.07.2019
comment
В настоящее время я не могу найти хороших ссылок в стандарте (на самом деле не хватает времени, чтобы покопаться) ... Вы пробовали педантичный режим компиляции или что-то подобное? gcc иногда бывает слишком снисходительным.   -  person Jean-Baptiste Yunès    schedule 10.07.2019
comment
Не жалуется даже с -Wall -Wextra -Wpedantic   -  person Tharwen    schedule 10.07.2019
comment
Да, я тоже пробовал ... Не вижу, правильно это или нет в стандарте (но стандарт не всегда понятен :-). Извините, мне нужно уйти сейчас же!   -  person Jean-Baptiste Yunès    schedule 10.07.2019
comment
возможно дублирование до stackoverflow.com/questions/41842987/   -  person Hui    schedule 10.07.2019
comment
comment
Это CWG2335.   -  person Davis Herring    schedule 10.07.2019
comment
GCC 8.2 для ARM компилирует код. Но ICC 19.0.1 сообщает о некоторых ошибках godbolt.org/z/V1ekvS   -  person phuclv    schedule 11.07.2019