C++ std::ranges::sort不能用作';constexpr';在lambda函数中保存其返回值时

C++ std::ranges::sort不能用作';constexpr';在lambda函数中保存其返回值时,c++,lambda,constexpr,c++20,std-ranges,C++,Lambda,Constexpr,C++20,Std Ranges,此函数f可以将C++20范围算法对象作为参数,然后使用它: constexpr auto f(auto algo) { return [=] { algo(std::array{1, 0}); return true; }(); } 它可以很好地处理std::ranges::sort: static_assert(f(std::ranges::sort)); 但是当我在lambda中保存algo的返回值时: constexpr auto f(auto algo) {

此函数
f
可以将C++20范围算法对象作为参数,然后使用它:

constexpr auto f(auto algo) {
  return [=] {
    algo(std::array{1, 0});
    return true;
  }();
}
它可以很好地处理
std::ranges::sort

static_assert(f(std::ranges::sort));
但是当我在lambda中保存
algo
的返回值时:

constexpr auto f(auto algo) {
  return [=] {
    auto it = algo(std::array{1, 0});
    return true;
  }();
}


如果我将迭代器声明为constexpr,它对我有效:

constexpr auto it = algo(std::array{1, 0});

没错,但这不能解释为什么。根据您的逻辑,也应该无法编译,因为
a
不是
constexpr
。对。我想可能是因为int是一种文字类型而it不是。但实际上std::array::iterator是一种文本类型,std::ranges::sort的定义是constexpr。但是,只对数组进行排序而不将其返回值赋给变量也会编译。所以我猜这是一个bug。它不返回
std::array::iterator
,我怀疑可能是编译器bug或复杂规则不允许函数为constexpr。像这样的问题通常需要一个深入的解释或确认这是一个来自实现者的bug。
constexpr auto f(auto algo, auto... args) {
  return [=] () mutable {
    auto it = algo(args...);
    return true;
  }();
}

// those are ok
static_assert(f(std::ranges::reverse, std::array{0})); 
static_assert(f(std::ranges::fill, std::array{0}, 0));
// those are not ok
// static_assert(f(std::ranges::sort, std::array{0}));    
// static_assert(f(std::ranges::replace, std::array{0}, 0, 0)); 
// static_assert(f(std::ranges::unique, std::array{0}));
// static_assert(f(std::ranges::next_permutation, std::array{0}));
// static_assert(f(std::ranges::prev_permutation, std::array{0}));
constexpr auto it = algo(std::array{1, 0});