std::function
's move constructor should guarantee nothrow for reference_wrapper
s and function pointersSection: 22.10.17.3.2 [func.wrap.func.con] Status: C++17 Submitter: Tim Song Opened: 2015-12-05 Last modified: 2017-07-30
Priority: 0
View all other issues in [func.wrap.func.con].
View all issues with C++17 status.
Discussion:
22.10.17.3.2 [func.wrap.func.con]/5 guarantees that copying a std::function
whose "target is a callable object passed
via reference_wrapper
or a function pointer" does not throw exceptions, but the standard doesn't provide this guarantee for the move constructor,
which makes scant sense.
[2016-02, Issues Telecon]
P0; move to Tentatively Ready.
Proposed resolution:
This wording is relative to N4567.
[Drafting note: The inserted paragraph is a copy of 22.10.17.3.2 [func.wrap.func.con]/5, only changing "copy constructor" to "copy or move constructor". It does not attempt to fix the issue identified in LWG 2370, whose P/R will likely need updating if this wording is adopted.]
Insert after 22.10.17.3.2 [func.wrap.func.con]/6:
function(function&& f); template <class A> function(allocator_arg_t, const A& a, function&& f);-6- Effects: If
-?- Throws: Shall not throw exceptions if!f
,*this
has no target; otherwise, move-constructs the target off
into the target of*this
, leavingf
in a valid state with an unspecified value.f
's target is a callable object passed viareference_wrapper
or a function pointer. Otherwise, may throwbad_alloc
or any exception thrown by the copy or move constructor of the stored callable object. [Note: Implementations are encouraged to avoid the use of dynamically allocated memory for small callable objects, for example, wheref
's target is an object holding only a pointer or reference to an object and a member function pointer. — end note]