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 { };
参照
- P0302R1 Removing Allocator Support in
std::function
(rev 1) - LWG Issue 2385.
function::assign
allocator argument doesn't make sense - Proposal - non allocating
std::function
- std-proposals
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。