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の以下の階層の下に解説ページを用意する予定です。