簡體   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