人们已经提供了答案。我只想补充一下。
编辑:第二个不是与std::initializer_list
进行比较,实际上是无效的语法,因为像{1,2}
这样的东西并没有任何固有的类型(尝试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
之间的比较运算符不可用,可能是有充分理由的,因为一个initializer_list
是一个轻量级代理对象,提供对类型为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};
std::initializer_list<int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
}
{
std::pair<int, long> pair {1, 2};
std::initializer_list<long int> list {1, 2};
std::cout<<std::boolalpha<<foo(pair, list)<<'\n';
}
{
std::pair<int, long> pair {1, 2};
if(foo(pair, {1, 2})) {
std::cout<<"Matched\n";
}
}
}
pair<int, std::string>
。 - bolovoperator=
,它是list-initialization。 - Remy Lebeau