Как убрать ошибку, которая возникает только в VS(v140)?
#include <variant>
#include <type_traits>
#include <functional>
#include <array>
#define STD ::std::
template<typename T>
struct remove_cvref {
using type = STD remove_cv_t<STD remove_reference_t<T>>;
};
template<typename T>
using remove_cvref_t = typename remove_cvref<T>::type;
template<typename Iter>
using iter_reference_t = decltype(*STD declval<Iter&>());
template<typename Func, typename... Iters>
using indirect_result_t = STD invoke_result_t<Func, iter_reference_t<Iters>...>;
//using indirect_result_t = STD invoke_result_t<Func, decltype(*STD declval<Iters&>())...>;
template<typename Range>
using iterator_t = decltype(std::begin(STD declval<Range&>()));
template<typename Iter, typename Proj, typename IndirectResultT = indirect_result_t<Proj, Iter>>
struct projected {
using value_type = remove_cvref_t<IndirectResultT>;
IndirectResultT operator*() const; // not defined
};
struct identity {
template <typename T>
constexpr T&& operator()(T&& t) const noexcept {
return std::forward<T>(t);
}
using is_transparent = void;
};
template<typename Range,
typename Comp = std::less<>,
typename Proj = identity,
typename = indirect_result_t<Comp&, projected<iterator_t<Range>, Proj>, projected<iterator_t<Range>, Proj>>
>
constexpr auto sort(Range&& range, Comp comp = {}, Proj proj = {}) {
}
int main(){
STD array<int, 2> ar = {1, 2};
sort(ar);
}
Если поменять indirect_result_t на закомментированную строку, то ошибка исчезает. Использую VS17(v140). В VS19(v141) ошибки нет.
Как определить iter_reference_t, чтобы убрать ошибку?