myoukakuのブログ

C++でゲームエンジンを作っていきます。

Visual Studio 2013 の std::is_pod のバグ

Visual Studio 2013 Update 3 では以下のコードがコンパイルエラーになります。

#include <type_traits>
static_assert(std::is_pod<int>::value == true, "");
static_assert(std::is_pod<int*>::value == true, "");
static_assert(std::is_pod<int&>::value == false, "");  // 1
static_assert(std::is_pod<int&&>::value == false, ""); // 2

1と2のアサートに失敗します。 参照型と右辺値参照型の is_pod が true になってしまいます。

C++の規格書を読む限り、参照型はPOD型ではないのでこれらはfalseになるのが正しい挙動のはずです。

他の処理系では

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

gccとclangでは上記のコードはエラーになりません。正しい結果です。

Boost.TypeTraitsでは

boost::is_podでは次のコードはエラーになりません。正しい結果です。

static_assert(boost::is_pod<int&>::value == false, "");
static_assert(boost::is_pod<int&&>::value == false, "");

std::is_podに関する他のバグ

std::is_podのバグ - とくにあぶなくないRiSKのブログ

まとめ

規格書と他の処理系の実装を見る限り、VisualStudio2013の挙動はバグではないかと思います。 ググっても参照のis_podに関して書いているところが見つからなかったので*1自信はありません・・・。

*1:sscrisk (id:RiSK)さんが書いているのに類する情報はあった