4

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

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

而这不会:

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

是因为运算符=为 std::pair 重载,而==不是吗?

4

2 回答 2

2

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

于 2021-04-15T22:18:01.100 回答
1

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

编辑:第二个不是与 an 的比较,std::initializer_list实际上是无效的语法,因为类似的东西{1,2}没有任何固有的类型(尝试decltype({1,2}) x。这是list-initialization失败的语言语法,因为这不是初始化语句本身不像x{1,2}//等类似的东西可以用来构造一个using但本身不是一个x = {1,2}foo({1,2}){1,2}initializer_listlist-initializationstd::initializer_list

std::pairan和 an之间的 Comaprison 运算符std::initializer_list不可用,这可能是有充分理由的,因为 aninitializr_list

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

注意 an 所有成员的类型都是initializer_list相同的const T。对于pair通常具有不同类型的aTU.

pair如果你愿意,你可以在 a和a 之间编写一个相等函数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";
        }
    }
}
于 2021-04-15T22:17:26.347 回答