C++1z reference_wrapperがTriviallyCopyableであることを保証

C++11では、関数テンプレートに渡す引数を参照として渡すことを明示するstd::reference_wrapperクラスが導入されました。

これは通常、オブジェクトへの参照を受け取ってそのポインタを保持しておく、という簡単な方法で実装されます。このような実装になっているとreference_wrapperオブジェクトに対してmemcpy操作ができるのですが、そうなっていない実装が存在した(MSVC)ということで、実装を強制する保証が入ります。

標準C++にはTriviallyCopyableというコンセプトがあり、reference_wrapperクラスのオブジェクトはテンプレートパラメータに何が指定されたとしても、TriviallyCopyableコンセプトの要件を満たすことが実装に求められるようになります。

この保証があることで、Small Buffer Optimicationという最適化を、reference_wrapperのオブジェクトに対しても適用できるようになります。

template <class T, class Buffer>
struct use_small_buffer_optimization
    : std::integral_constant<bool,
        sizeof(T) <= sizeof(Buffer)
     && alignof(Buffer) % alignof(T) == 0
     && std::is_trivially_copyable<T>::value
     && std::is_copy_constructible<T>::value
> {};

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。