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

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

std::is_scalarのバグ

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

再現コード

#include<type_traits>
#include<cstddef>

static_assert(std::is_scalar<std::nullptr_t>::value, "");

int main(){}

std::nullptr_tはスカラ型(scalar types)なので、static_assertに成功すべきだが失敗してしまう。

規格

N3337(PDF) 3.9/9に次のように書かれている。

Arithmetic types (3.9.1), enumeration types, pointer types, pointer to member types (3.9.2), std::nullptr_t, and cv-qualified versions of these types (3.9.3) are collectively called scalar types.

他の処理系

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

GCC

4.3.6, 4.4.7, 4.5.4はstd::nullptr_tに対応していないので、std::is_scalarstd::nullptr_tを除いた実装になっている。4.6.4, 4.7.3, 4.8.1 では正しい結果。

Clang

3.0, 3.1, 3.2, 3.3で正しい結果。