C++1z std::functionクラスのアロケータサポートを削除

C++11で導入されたstd::functionクラスには、アロケータを受け取るコンストラクタとassign()メンバ関数がありました。しかし、その仕様が不明確であったことから、正しい実装が行われてきませんでした。

  • GCCの標準ライブラリ実装であるlibstdc++では、アロケータを受け取るコンストラクタを提供していなかった
  • Clangの標準ライブラリ実装であるlibc++では、アロケータを受け取るコンストラクタはあったが、アロケータ引数は無視されていた
  • MSVCはアロケータを使用するが、代入の際にアロケータが伝搬されていなかった

そのため、これらの機能はC++1zで削除されます。

削除される機能

std::functionクラスの、アロケータを受け取るコンストラクタ、およびassign()メンバ関数

template<class A> function(allocator_arg_t, const A&) noexcept;
template<class A> function(allocator_arg_t, const A&, nullptr_t) noexcept;
template<class A> function(allocator_arg_t, const A&, const function&);
template<class A> function(allocator_arg_t, const A&, function&&);
template<class F, class A> function(allocator_arg_t, const A&, F);

template<class F, class A> void assign(F&&, const A&);

scoped allocatorから参照されるuses_allocatorの特殊化:

template<class R, class... ArgTypes, class Alloc>
struct uses_allocator<function<R(ArgTypes...)>, Alloc>
    : true_type { };

参照

お断り

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