gpt4 book ai didi

c++ - 在类模板的成员函数中使用不完整类型

转载 作者:可可西里 更新时间:2023-11-01 18:23:15 25 4
gpt4 key购买 nike

GCC(8.3、9.1)、Clang(7、8)和 MSVC(19.20)的不同之处在于它们编译此代码的能力:

struct C;

template<typename T> struct S {
void foo() {
// C2 c;
C c;
}
};

class C {};

int main() {
S<int> s;
s.foo();
return 0;
}

GCC 和 MSVC 接受它,而 Clang 拒绝它。即使我将 foo 本身作为模板和/或根本不调用它,Clang 也会拒绝它。

我的理解是,foo除非被调用,否则不会被实例化,而是在被调用的地方被实例化。到那时,C 就完成了,代码应该可以编译了。这是GCC的推理吗?

作为旁注,如果未调用 foo,即使我将 C 替换为未声明的 C2,MSVC 也会接受代码 foo - 在这种情况下,它似乎只是检查函数体在语法上是否正确。

根据标准,哪种行为是正确的?如果是 Clang 的,为什么标准禁止 GCC 提供的灵 active ?

最佳答案

由于[temp.res]/8,这是错误的格式,不需要诊断:

The program is ill-formed, no diagnostic required, if:

  • [...]
  • a hypothetical instantiation of a template immediately following its definition would be ill-formed due to a construct that does not depend on a template parameter, or [...]
  • [...]

所以整个程序都不好,但是不需要实现来诊断它。 Clang 有,这对 clang 有好处,gcc 和 MSVC 没有,这没有错。

关于c++ - 在类模板的成员函数中使用不完整类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56025227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com