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

Пример кода:

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

...