mirror of git://gcc.gnu.org/git/gcc.git
The standard requires that the std::thread constructor is constrained so it can't be called with a first argument of type std::thread. The current implementation only meets that requirement if the constructor is called with one argument, by using deleted overloads. This uses an enable_if constraint to enforce the requirement for any number of arguments. Also add a static assertion to give a more readable error for invalid arguments that cannot be invoked. Also simplify _Invoker to reduce the error cascade for ill-formed instantiations with non-invocable arguments. PR libstdc++/84535 * include/std/thread (thread::__not_same): New SFINAE helper. (thread::thread(_Callable&&, _Args&&...)): Add SFINAE constraint that first argument is not a std::thread. Add static assertion to check INVOKE expression is valid. (thread::thread(thread&), thread::thread(const thread&&)): Remove. (thread::_Invoke::_M_invoke, thread::_Invoke::operator()): Use __invoke_result for return types and remove exception specifications. * testsuite/30_threads/thread/cons/84535.cc: New. From-SVN: r259893 |
||
|---|---|---|
| .. | ||
| async | ||
| call_once | ||
| condition_variable | ||
| condition_variable_any | ||
| future | ||
| headers | ||
| lock | ||
| lock_guard | ||
| mutex | ||
| once_flag/cons | ||
| packaged_task | ||
| promise | ||
| recursive_mutex | ||
| recursive_timed_mutex | ||
| scoped_lock | ||
| shared_future | ||
| shared_lock | ||
| shared_mutex | ||
| shared_timed_mutex | ||
| this_thread | ||
| thread | ||
| timed_mutex | ||
| try_lock | ||
| unique_lock | ||