2012-12-11 35 views
1

通過C++ 11標準std::is_base_of<B, D>必須返回true,如果D從B派生或如果兩者都是相同的非聯合類。但在VC++ 2010中,如果類型B是D類型的唯一基類,則stl實現模板返回true!這是一個錯誤嗎?VC2010執行std :: is_base_of包含錯誤?

在例如部分

std::is_base_of<base, base> == true 

http://msdn.microsoft.com/en-us/library/bb982243(v=vs.100).aspx頁面,但這並不符合VC++ 2010 STL實現。儘管它符合C++ 11標準的要求。錯誤在哪裏?

+0

請記住,C++ 11還是相當新的,標準中的許多功能還沒有實現。甚至連VC++ 2012都沒有實現完整的C++ 11。 –

+1

對於VS2010 SP1和VS2012,'std :: is_base_of :: value'評估爲'true'。可能它是SP1之前的錯誤? (我沒有簡單的方法來測試沒有SP1的VS2010)。你能發佈一個可顯示問題的可編譯代碼嗎? –

+0

當然可以。 'static_assert(is_base_of :: value,「無效的std :: is_base_or_same實現」);'總是錯誤的。我的VS 2010版本是「10.0.40219.1 SP1Rel」 – 23W

回答

7

is_base_of<int, int>::value評估爲false(您的評論指出,這是你的實際問題),因爲is_base_of<>::value可以評估到true只有在模板參數類類型。在C++ 11標準的表51 - 類型關係謂詞(C++ 20.9.6「類型之間的關係」)定義is_base_type<>評估爲真,當且僅當(強調):

Base是基類的衍生的,而不考慮cv修飾符或基類和派生不工會和名相同類類型而不考慮cv修飾符

甚至以下作爲它的一個實例(該C++ 11標準C++ 11 20.9.6/3):

is_base_of<int, int>::value // false 
+0

+1 - 哈哈完美,顯示了問題中的簡單代碼示例如何清除整個問題。 –

+0

謝謝,我沒有看到它的課程。 – 23W