[英]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。 這只是一個糟糕的考驗。
在這種情況下, GCC
和clang
之間的唯一區別是它們處理模板類函數的方式:
GCC
:所有這些都是一次性的。 clang
:只使用過的那個。 在我們的第一個例子中,函數min()
沒有被調用,因此, clang
沒有問題。 GCC
,解析所有函數並發現min()
無效。
在第二個例子中,同樣的情況發生了: bar()
沒有被任何人調用,因此clang
對於它的clang
是可以的。 但是, GCC
再次遇到問題,盡管在程序的任何地方都沒有使用過。
說某些東西是不好的,讓我們解決它:這個例子將失敗, GCC
和clang
幾乎都有相同的錯誤( 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.