我想知道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是同一个原因吗?
1条答案
按热度按时间nfeuvbwi1#
您的代码
std::ranges::is_sorted({ ONE, TWO })
的问题在于,它无法在模板参数中推导出{ ONE, TWO }
的类型。要实际执行此操作,必须首先手动创建
initializer_list
:或者函数本身不能推导出此参数的类型。
顺便说一句,这是
auto
的行为与模板推导不同的一个地方。auto
被特别地赋予在以下语法内推导il
的能力:没有其他通常等价的语法可以将其推导为
initializer_list
,包括auto il{a, b, c}
、template_func({a, b, c})
等。