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

Why does GCC allow a deduced return type in this function template when MSVC and Clang don't?

提问人:Tharwen 提问时间:7/10/2019 最后编辑:Tharwen 更新时间:10/16/2021 访问量:181

问:

代码示例:

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 都声称不能使用,因为当时没有定义它,但 GCC 编译时没有错误或警告。GetInt()

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

然而,这并不能解释为什么海湾合作委员会允许它。这样做不正确吗?

C GCC 可视化-C++ CLANG 模板-元编程

评论

0赞 L. F. 7/10/2019
我认为代码是正确的。
0赞 Jean-Baptiste Yunès 7/10/2019
记不清了,但推断出的返回类型不太适合 SFINAE......
1赞 Jean-Baptiste Yunès 7/10/2019
函数定义在类定义的末尾进行处理,因此在解析模板时,返回类型实际上是未知的......
0赞 Tharwen 7/10/2019
@Jean-BaptisteYunès 那么海湾合作委员会肯定应该拒绝它吗?
1赞 Davis Herring 7/11/2019
这是CWG2335

答:

0赞 Fedor 10/16/2021 #1

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

它仍在讨论中。

虽然看起来 Clang/MSVC 行为可能会成为标准:

2018年6月会议记录: CWG 的共识是,通过以下方式对模板和类一视同仁 在需要时“实例化”延迟解析区域,而不是在 课程结束。