为什么在MSVC和Clang不允许的情况下,GCC在此函数模板中允许推导的返回类型?

Tha*_*wen 7 c++ gcc clang visual-c++ template-meta-programming

代码示例:

class A
{
    static constexpr auto GetInt() noexcept { return 6; }

    template<int N>
    std::enable_if_t< N >= GetInt(), int> func() { return N; }
};
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/-0pwIQ

Clang和MSVC都声称GetInt()无法使用,因为当时尚未定义,但是GCC编译时没有错误或警告。

对于为什么会发生错误的最佳猜测是,由于类在时不完整func(),成员函数被认为是未定义的,并且由于auto依赖于函数定义来推断返回类型,因此编译器无法使用它来生成功能签名。

但是,这并不能解释为什么GCC允许这样做。这样做是不正确的吗?

Fed*_*dor 0

正如评论中已经提到的,这是 C++ 标准核心语言活跃问题之一:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2335

目前仍在讨论中。

尽管看起来 Clang/MSVC 行为确实可能成为标准:

2018 年 6 月会议的注释:CWG 的共识是通过在需要时(而不是在类结束时)“实例化”延迟解析区域来同等对待模板和类。