【发布时间】: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; }
};
Clang 和 MSVC 都声称不能使用 GetInt(),因为它当时没有定义,但是 GCC 编译时没有错误或警告。
对于为什么会发生错误,我最好的猜测是因为类在 func() 处不完整,成员函数被认为是未定义的,并且因为 auto 依赖于函数定义来推断返回类型,所以编译器可以' t 使用它来生成函数签名。
但是,这并不能解释为什么 GCC 允许这样做。这样做不正确吗?
【问题讨论】:
-
我认为代码是对的。
-
记不清了,但推断的返回类型与 SFINAE 不太吻合...
-
函数定义在类定义的末尾处理,因此在解析模板时返回类型实际上是未知的......
-
@Jean-BaptisteYunès 那么海湾合作委员会肯定会拒绝它吗?
-
这是CWG2335。
标签: c++ gcc visual-c++ clang template-meta-programming