2014-01-07 82 views
8

鑑於以下MSVC12自以爲骨料自std ::陣列並不莢

#include <array> 

struct litmus final : std::array<unsigned char, 16> 
{ 
}; 

static_assert(std::is_pod<std::array<unsigned char, 16> >::value, "not pod"); 

// this fails on MSVC: 
static_assert(std::is_pod<litmus>::value, "not pod"); 

以下編譯器同意litmus是莢果:

但是,MSVC12(VS2013 RTM)認爲第二個斷言失敗。

  1. 誰是對的?
  2. 有沒有什麼竅門可以讓MSVC將這個類視爲pod?

編輯有關信息:is_trivially_copyable<litmus>回報上MSVC真正的煩躁。這對許多不嚴格要求實際POD性能的情況可能有用。

+2

FWIW我看了標準第9節中的* standard-layout class *和* POD struct *的規範,我同意'石蕊'應該是POD。雖然不能提供解決方法。 – BoBTFish

+1

甚至不知道你可以使用'最終'那樣,謝謝! – user1233963

+0

假設您的用例實際上與此示例一樣簡單,您可以專門爲'litmus'的'std :: is_pod'返回true。 –

回答

8
  1. GCC and Clang;那個班是POD。

  2. 這取決於什麼究竟是你的意思是「讓MSVC把這個類視爲pod」。如果你的意思是編譯器內部,那麼沒有。但是,你可以(在實踐中)專門性狀爲litmus

    namespace std { 
    
    template <> 
    struct is_pod<litmus> : std::true_type 
    {}; 
    
    } 
    

    注意,由標準要嚴格,這給未定義的行爲(感謝@ R.MartinhoFernandes指出了這一點)。但是,作爲編譯器特定的解決方法,我期望它能夠工作。使用沒有任何保證。

+4

要嚴格正確:**不,你不能**專門化它的特質。使'std :: is_pod'不僅不是作爲一個功能,而且它是明確禁止的*。但是,這是一個編譯器專用的解決方法,它很好。 –

+0

@ R.MartinhoFernandes謝謝,修正。我不知道特質類型專業化是明確禁止的;但它確實有意義。 – Angew

+0

@Angew對我來說,這關乎安全。我不介意斷言是否需要評論。我只需要知道這個類是可以按位複製的。我怎麼知道這是事實,如果編譯器的'is_pod'特性_不告訴我它是安全的? – sehe