【问题标题】:Code compiles with g++ but not clang++ if incomplete type is used in templated function如果在模板函数中使用不完整类型,则代码使用 g++ 而不是 clang++ 编译
【发布时间】:2022-01-18 05:58:56
【问题描述】:
#include <variant>

struct A;
struct B;

using C = std::variant<A, B>;

struct A
{
  template <size_t n>
  void fun()
  {
    C c;
  }
};

我发布的代码是用 g++ 编译的,但不是 clang++。两者都使用-std=c++17。我不确定哪个是预期的,但希望我能解释为什么会发生这种情况,以及它是否是 g++ 规范承诺总是做的事情,或者它是否是 UB。

我的猜测是 g++ 以不同的顺序编译各种组件。模板在使用之前可能根本不会被实例化。但是为什么clang++会看到错误呢?

【问题讨论】:

  • gcc 没有诊断出 ndr BTW 的问题。

标签: c++ templates


【解决方案1】:

显然http://eel.is/c++draft/temp.res#8 有一个解释说,如果“由于不依赖于模板参数的构造,紧随其定义的模板的假设实例化将是错误的”,则该程序是错误的。

现在我想知道 g++ 是否有一个功能可以让它工作,或者它不是我可以依赖的东西。

【讨论】:

  • 它特别“格式错误,不需要诊断”,所以任何事情都可能发生(包括将其编译为“预期”)。所以这确实是 g++ 的一个缺点,因为它不会实例化 C,即使它不是从属名称。可能是为了节省编译时间,实例化甚至可能不会使用的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2021-02-19
  • 2017-07-03
  • 2021-12-11
相关资源
最近更新 更多