【问题标题】:Why does GCC allow a deduced return type in this function template when MSVC and Clang don't?为什么 GCC 允许在这个函数模板中推导出返回类型,而 MSVC 和 Clang 不允许?
【发布时间】:2019-11-20 00:34:37
【问题描述】:

代码示例:

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 依赖于函数定义来推断返回类型,所以编译器可以' t 使用它来生成函数签名。

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

【问题讨论】:

  • 我认为代码是对的。
  • 记不清了,但推断的返回类型与 SFINAE 不太吻合...
  • 函数定义在类定义的末尾处理,因此在解析模板时返回类型实际上是未知的......
  • @Jean-BaptisteYunès 那么海湾合作委员会肯定会拒绝它吗?
  • 这是CWG2335

标签: c++ gcc visual-c++ clang template-meta-programming


【解决方案1】:

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

仍在讨论中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2016-08-29
    • 2021-12-15
    • 2020-09-26
    • 2021-08-14
    相关资源
    最近更新 更多