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になるのが正しい挙動のはずです。
他の処理系では
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自信はありません・・・。