In C++17 a function can return a prvalue of a type that cannot be moved or copied. The current implementation of std::is_invocable_r uses std::is_convertible to test the conversion to R required by INVOKE<R>. That fails for non-copyable prvalues, because std::is_convertible is defined in terms of std::declval which uses std::add_rvalue_reference. In C++17 conversion from R to R involves no copies and so is not the same as conversion from R&& to R. This commit changes std::is_invocable_r to check the conversion without using std::is_convertible. std::function also contains a similar check using std::is_convertible, which can be fixed by simply reusing std::is_invocable_r (but because std::is_invocable_r is not defined for C++11 it uses the underlying std::__is_invocable_impl trait directly). PR libstdc++/91456 * include/bits/std_function.h (__check_func_return_type): Remove. (function::_Callable): Use std::__is_invocable_impl instead of __check_func_return_type. * include/std/type_traits (__is_invocable_impl): Add another defaulted template parameter. Define a separate partial specialization for INVOKE and INVOKE<void>. For INVOKE<R> replace is_convertible check with a check that models delayed temporary materialization. * testsuite/20_util/function/91456.cc: New test. * testsuite/20_util/is_invocable/91456.cc: New test. From-SVN: r274542
Name |
Last commit
|
Last update |
---|---|---|
.. | ||
algorithm | Loading commit data... | |
any | Loading commit data... | |
array | Loading commit data... | |
atomic | Loading commit data... | |
bit | Loading commit data... | |
bitset | Loading commit data... | |
charconv | Loading commit data... | |
chrono | Loading commit data... | |
codecvt | Loading commit data... | |
complex | Loading commit data... | |
condition_variable | Loading commit data... | |
deque | Loading commit data... | |
execution | Loading commit data... | |
filesystem | Loading commit data... | |
forward_list | Loading commit data... | |
fstream | Loading commit data... | |
functional | Loading commit data... | |
future | Loading commit data... | |
iomanip | Loading commit data... | |
ios | Loading commit data... | |
iosfwd | Loading commit data... | |
iostream | Loading commit data... | |
istream | Loading commit data... | |
iterator | Loading commit data... | |
limits | Loading commit data... | |
list | Loading commit data... | |
locale | Loading commit data... | |
map | Loading commit data... | |
memory | Loading commit data... | |
memory_resource | Loading commit data... | |
mutex | Loading commit data... | |
numbers | Loading commit data... | |
numeric | Loading commit data... | |
optional | Loading commit data... | |
ostream | Loading commit data... | |
queue | Loading commit data... | |
random | Loading commit data... | |
ratio | Loading commit data... | |
regex | Loading commit data... | |
scoped_allocator | Loading commit data... | |
set | Loading commit data... | |
shared_mutex | Loading commit data... | |
sstream | Loading commit data... | |
stack | Loading commit data... | |
stdexcept | Loading commit data... | |
streambuf | Loading commit data... | |
string | Loading commit data... | |
string_view | Loading commit data... | |
system_error | Loading commit data... | |
thread | Loading commit data... | |
tuple | Loading commit data... | |
type_traits | Loading commit data... | |
typeindex | Loading commit data... | |
unordered_map | Loading commit data... | |
unordered_set | Loading commit data... | |
utility | Loading commit data... | |
valarray | Loading commit data... | |
variant | Loading commit data... | |
vector | Loading commit data... | |
version | Loading commit data... |