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

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

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

std::is_standard_layoutのバグ

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

再現コード

以下の二つのstatic_assertに失敗してしまう。参照型を標準レイアウト型とみなしてしまっている。

#include<type_traits>

static_assert(std::is_standard_layout<int&>::value == false, "");
static_assert(std::is_standard_layout<int&&>::value == false, "");

int main(){}

std::is_standard_layoutが内部で使っている組み込みの__is_standard_layoutに問題があるようだ。

規格

N3337(PDF) 3.9/9

Scalar types, standard-layout class types (Clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called standard-layout types.

参照型は、どれにも該当しないので標準レイアウト型(standard-layout types)ではない

なお、標準レイアウト型の一つである標準レイアウトクラス型(standard-layout class types)についてはstandard-layout class - とくにあぶなくないRiSKのブログを参照のこと。

他の処理系

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

GCC

4.3.6, 4.4.7はstd::is_standard_layoutを実装していない。4.5.4, 4.6.4, 4.7.3, 4.8.1で正しい結果。

Clang

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