提问人:Tharwen 提问时间:7/10/2019 最后编辑:Tharwen 更新时间:10/16/2021 访问量:181
为什么 GCC 允许在此函数模板中推导返回类型,而 MSVC 和 Clang 不允许?
Why does GCC allow a deduced return type in this function template when MSVC and Clang don't?
问:
代码示例:
class A
{
static constexpr auto GetInt() noexcept { return 6; }
template<int N>
std::enable_if_t< N >= GetInt(), int> func() { return N; }
};
Clang 和 MSVC 都声称不能使用,因为当时没有定义它,但 GCC 编译时没有错误或警告。GetInt()
对于为什么会发生错误,我的最佳猜测是,由于该类在 时不完整,成员函数被认为是未定义的,并且由于 auto 依赖于函数定义来推断返回类型,因此编译器无法使用它来生成函数签名。func()
然而,这并不能解释为什么海湾合作委员会允许它。这样做不正确吗?
答:
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 的共识是,通过以下方式对模板和类一视同仁 在需要时“实例化”延迟解析区域,而不是在 课程结束。
评论