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

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

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

std::is_trivialのバグ

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

再現コード

以下の二つのstatic_assertで失敗してしまう。参照型を自明型とみなしてしまっている。

#include<type_traits>

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

int main(){}

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

規格

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

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

参照型は、どれにも該当しないので自明型(trivial types)ではない

他の処理系

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

Visual Studio

Visual Studio 2013(Visual C++ 12.0)では、バグが修正されており正しい結果。 *1

GCC

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

Clang

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

*1:@nekko1119 さんに教えてもらいました。 Twitter 1 Twitter 2 Twitter 3 Twitter 4