Loosen the requirements on the container passed to QtConcurrent::map*

Using std::begin() and std::end() forces the user to have const begin()
and end() member functions being defined for the passed container. This
is because std::declval<T>() returns rvalue which forces the compiler
to select std::{begin, end}()(const Container &c) overloads and an test
for a presence of const {begin, end}() methods.

Change-Id: I9d96d9f73891ece53224f1741a1334500f7b35ad
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
Sona Kurazyan 2020-10-12 14:24:07 +02:00
parent 1918c689d7
commit d5c53554e5
3 changed files with 3 additions and 5 deletions

View File

@ -51,8 +51,8 @@ namespace QtPrivate {
template <class T, typename = void>
struct IsIterable : std::false_type {};
template <class T>
struct IsIterable<T, std::void_t<decltype(std::begin(std::declval<T>())),
decltype(std::end(std::declval<T>()))>>
struct IsIterable<T, std::void_t<decltype(std::declval<T>().begin()),
decltype(std::declval<T>().end())>>
: std::true_type
{ };

View File

@ -77,7 +77,7 @@ struct Argument
template <class Sequence>
struct Argument<Sequence, typename std::enable_if<IsIterableValue<Sequence>>::type>
{
using Type = std::decay_t<decltype(*std::begin(std::declval<Sequence>()))>;
using Type = std::decay_t<decltype(*std::declval<Sequence>().begin())>;
};
template <class Iterator>

View File

@ -159,8 +159,6 @@ public:
const_iterator cend() const { return data.cend(); }
iterator begin() { return data.begin(); }
iterator end() { return data.end(); }
const_iterator begin() const { return data.cbegin(); }
const_iterator end() const { return data.cend(); }
bool operator==(const MoveOnlyVector &other) const { return data == other.data; }
private: