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

ehxuflar  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(170)

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

#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):如果您的输入是空的,那么您可以使用以下命令:无法推导'_Rng'* 模板参数
这和this one是同一个原因吗?

nfeuvbwi

nfeuvbwi1#

您的代码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})等。

相关问题