为什么 std::pair 不能与 std::initiliazer_list 相提并论

Why can't std::pair be compared to std::initiliazer_list

对于 std::pair,我只是想知道为什么会这样

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

然而,这不是:

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

是否因为运算符 = 对于 std::pair 超载而 == 不是?

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

编辑:第二个是 不是 std::initializer_list 的比较,实际上是无效语法,因为像 {1,2} 这样的东西没有任何固有的type 这样(尝试 decltype({1,2}) x。这是 list-initialization 的语言语法,它失败了,因为这不是 initialization[=51 的语句=] 本身不同于 x{1,2}/x = {1,2}/foo({1,2}) 等。像 {1,2} 这样的东西可以用来 构造 initializer_list 使用 list-initialization 但它本身不是 std::initializer_list

std::pairstd::initializer_list 之间的 Comaprison 运算符不可用,这可能是有充分理由的,因为 initializr_list is a

lightweight proxy object that provides access to an array of objects of type const T.

请注意,initializer_list 的所有成员的类型都是同一类型 const Tpair 的情况并非如此 通常 具有不同的类型 TU.

如果你愿意,你可以写一个 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<<"Matched\n";
        }
    }
}

这只是语法:braced-init-list 可以是操作数 only to [] and ()(在里面)和 = 以及任何 @=(在右边)。也允许初始化情况,其中根本没有运算符。