本身未实例化的函数中的错误实例。clang 和 gcc 之间的行为差​​异

Sup*_*mum 1 c++ templates language-lawyer

考虑以下 C++ 程序:

template<typename X>
struct S
{
    X x;
};

template<typename>
void f()
{
    S<void> s;
}

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

当使用“-std=c++17 -pedantic-errors”编译时,它会给出clang的编译错误,但不会给出gcc的编译错误。

C++ 标准对这个程序有什么看法?是否有效?如果它无效,它是否具有未定义的行为?

如果回答这个问题的人可以继续并在他们的答案中包含 C++ 标准的相关部分,那就太好了。

用于尝试此操作的编译器资源管理器链接:https : //godbolt.org/z/Ke1K7b

Sto*_*ica 7

您的函数模板使程序格式错误,无需诊断。

[温度]

8可以在任何实例化之前检查模板的有效性。[注意:知道哪些名称是类型名称允许以这种方式检查每个模板的语法。— 尾注 ] 程序格式错误,无需诊断,如果:

  • 不能为模板或 constexpr if 语句的子语句生成有效的特化,并且模板未实例化,或

无论你f用什么实例化,它都会导致无效的声明。所以它与那个段落匹配。

Clang 会立即检查,GCC 不会,但这两种方法同样有效。无论哪种方式,问题都出在模板中的构造上,而不是出在编译器上。

  • @cigien - `S&lt;void&gt;` 可以被专门化为有效并不重要。该特化仍然需要在“f”之前可见,因为类型“S&lt;void&gt;”是不依赖的。它是不可见的,因此它只是一个无条件无效的构造,供我们插入 [temp.res]/8 中。 (4认同)