为什么不能将std::p air与std::initiliazer_list进行比较



对于std::pair,我只是想知道为什么它能在中工作

std::pair<int, int> response = {1, 2}

而这不是:

if (response == {1, 2}) do something;

是因为运算符=对std::pair过载,而==没有过载吗?

这只是语法:braked init list只能是[]()(内部(、=和任何@=(右侧(的操作数。初始化情况也是允许的,其中根本没有运算符。

人们已经给出了答案。我只想补充一点。

编辑:第二个是而不是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::pairstd::initializer_list之间的Comaprison运算符不可用,这可能是有充分理由的,因为initializr_list

提供对对象数组访问的轻量级代理对象const T.类型

注意,initializer_list的所有成员的类型都是相同类型的const T。对于通常具有不同类型TUpair,情况并非如此。

如果您愿意,您可以在pairinitializer_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<<"Matchedn";
}
}
}

最新更新