繁体   English   中英

clang vs gcc在编译时的抽象类处理中

[英]clang vs gcc in abstract class handling in compile time

nlohmann / json开源库的其中一个问题引起了我的注意。

我的情况下的最小再现那无法编译桌面GCC(4.8,4.9,还试图5+)的几个版本下却与Mac铛和Android NDK的GCC编译以及4.9

#include <limits>

struct base {
    virtual void foo() = 0;
};

int main() {
    (void)numeric_limits<base>::is_signed;
}

GCC试图用基类而不是派生来实例化std::numeric_limits

/usr/include/c++/4.8/limits: In instantiation of 'struct std::numeric_limits<base>': main.cpp:11:94:   required from here
/usr/include/c++/4.8/limits:309:7: error: cannot allocate an object of abstract type 'base'
min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }

我不太确定这是一个已知的编译器错误(如果失败)或功能/放宽规则(如果成功)

我试图用std::is_abstract来解决这个问题,但它没有帮助,看起来像'short-circuit'评估在enable_if中没有发生并且错误保持不变

我的问题主要不是如何为gcc修复此问题,但天气这是编译器错误或代码错误


编辑:添加“更多最小”示例,没有任何标准库依赖:

template <typename T>
struct foo
{
  static T bar();
  static constexpr bool value = true;
};

struct abstract
{
  virtual ~abstract() = 0;
};

int main()
{
  (void) foo<abstract>::value;
}

在clang 3.9.0上编译,但gcc 7快照为foo<abstract>::bar的无效返回类型发出错误。


编辑2:我有点惊讶我的初始问题是在未经我同意的情况下编辑的,不知道SO允许:)感谢帮助虽然我认为它带来了一些混乱和错误的答案,主要是因为文本和代码不是连接了

,这不是一个bug。 这只是一个糟糕的考验。

描述

在这种情况下, GCCclang之间的唯一区别是它们处理模板类函数的方式:

  • GCC :所有这些都是一次性的。
  • clang :只使用过的那个。

在我们的第一个例子中,函数min()没有被调用,因此, clang没有问题。 GCC ,解析所有函数并发现min()无效。

在第二个例子中,同样的情况发生了: bar()没有被任何人调用,因此clang对于它的clang是可以的。 但是, GCC再次遇到问题,尽管在程序的任何地方都没有使用过。

一个很好的测试

说某些东西是不好的,让我们解决它:这个例子将失败, GCCclang几乎都有相同的错误( invalid abstract return type 'base'allocating an object of abstract class type 'base' )。

#include <limits>

struct base {
    virtual void foo() = 0;
};

int main() {
    (void)std::numeric_limits<base>::min();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM