我想知道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})
等。