std::ranges如何与initializer_list一起工作?



我想知道std::ranges::*算法是否应该与std::initializer_list一起工作。例如,当使用x64 MSVC v19编译时,下面代码片段中的(B)行可以编译,而(A)行不能。最新和选项/std:c++latest(godbolt.org/z/5oTEz1q5P).

#include <algorithm>
#include <array>
#define ONE 1
#define TWO 2
static_assert(std::ranges::is_sorted({ ONE, TWO }));  // (A)
static_assert(std::ranges::is_sorted(std::array { ONE, TWO }));  // (B)
int main() {}

为initializer_list分配的底层临时数组应该一直存在,直到(A)行对is_sorted()的调用返回为止。

根据错误信息,std::initializer_list不能被强制转换为std::ranges::forward_range:算法(10432):'bool std::ranges::_Is_sorted_fn::operator ()(_Rng &&,_Pr,_Pj) const':无法推断'_Rng'的模板参数

这个和这个是同一个原因吗?

您的代码std::ranges::is_sorted({ ONE, TWO })的问题是,它不能在模板参数中推断出{ ONE, TWO }的类型。

要真正做到这一点,您必须首先手动创建一个initializer_list:

std::ranges::is_sorted(std::initializer_list{ ONE, TWO })

或者函数本身不能推断该形参的类型


旁注,这是auto的行为与模板演绎不同的地方。

auto被特别赋予了在这个语法中推断il的能力:

auto il = {a, b, c};

通常没有其他等价的语法可以将其推断为initializer_list,包括auto il{a, b, c},template_func({a, b, c})等。

最新更新