Как убрать ошибку, которая возникает только в 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, чтобы убрать ошибку?


Ответы (0 шт):