人们已经给出了答案。我只想补充。
编辑:第二个是 not 与 std::initializer_list 的比较,实际上是无效的语法,因为像 {1,2} 这样的东西没有任何固有的 type 作为这样的(尝试decltype({1,2}) x。这是list-initialization 的语言语法失败,因为这不是初始化 本身不像x{1,2}/x = {1,2}/foo({1,2}) 等的语句。像{1,2} 一样可以使用list-initialization构造一个initializer_list,但它本身不是一个std::initializer_list。
std::pair 和 std::initializer_list 之间的比较运算符不可用,这可能是有充分理由的,因为 initializr_list is a
提供对对象数组的访问的轻量级代理对象
const T 类型。
请注意,initializer_list 的所有成员的类型都与const T 的类型相同。 pair 的情况并非如此,通常 具有不同的类型 T 和 U。
如果您愿意,您可以在 pair 和 initializer_list 之间编写一个相等函数,如下所示,显然要遵守许多约束:
#include <iostream>
#include <type_traits>
#include <utility>
#include <initializer_list>
template <typename T, typename U>
bool foo(const std::pair<T, U>&pair,
const std::initializer_list<std::common_type_t<T, U>>& list) {
if(list.size() != 2) {
return false;
}
auto it = begin(list);
return pair.first == *it && pair.second == *std::next(it);
}
int main() {
{
std::pair<int, int> pair {1, 3};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, int> pair {1, 2};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, int> pair {1, 2};
std::initializer_list<int> list {1, 2, 3};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, char> pair {1, 2}; //common type is int
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
// std::pair<int, long> pair {1, 2}; //common type is long int
// std::initializer_list<int> list {1, 2}; //fails template substitution
// std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2}; //common type is long int
std::initializer_list<long int> list {1, 2}; //same as common type of pair
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2}; //common type is long int
if(foo(pair, {1, 2})) {
std::cout<<"Matched\n";
}
}
}