読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Visual C++ 2012のis_fundamentalはバグっている

Visual Studio 2012(Visual C++ 11.0)のstd::is_fundamentalはバグっている。

再現コード

以下のコードをコンパイルするとstatic_assertに失敗する。

#include<type_traits>
#include<cstddef>
static_assert(std::is_fundamental<std::nullptr_t>::value, "");

int main(){}

規格

規格を見るとN3337(PDF) 3.9.1/10に

A value of type std::nullptr_t is a null pointer constant (4.10). Such values participate in the pointer and the pointer to member conversions (4.10, 4.11). sizeof(std::nullptr_t) shall be equal to sizeof(void*).

と書かれており、Fundamental typesの一つとしてstd::nullptr_tが挙げられている。 std::nullptr_tはFundamental typeなので、static_assertに成功すべき。

その他の処理系

Visual C++

Visual C++ 2013 PR ではバグが修正されており正しい結果。(コメントでid:nekko1119さんに教えてもらいました。ありがとうございます。)

GCC

4.3.6, 4.4.7, 4.5.4はstd::nullptr_t自体に未対応なので、is_fundamentalstd::nullptr_tを除いた実装になっている。4.6.4, 4.7.3はstd::nullptr_tに対応しているが、Visual C++ 2012同様の問題がis_fundamentalにあり失敗する。4.8.1, HEADでは正しい結果。

Clang

3.0 - 3.3, HEADで正しい結果。