代码之家  ›  专栏  ›  技术社区  ›  cpp

int对向量的列表初始化

  •  1
  • cpp  · 技术社区  · 2 年前

    我正在列表初始化一个包含int对的向量。

    我对以下工作的理解与预期一致:

    int main()
    {
        std::vector<std::pair<int, int>> vpairs_first{std::make_pair(0, 1), std::make_pair(0, -1)};
        return 0;
    }
    
    int main()
    {
        std::vector<std::pair<int, int>> vpairs_second{{0, 1}, {0, -1}};
        return 0;
    }
    

    然而,有人能解释一下为什么以下方法不起作用吗?

    int main()
    {
        std::vector<std::pair<int, int>> vpairs_third{(0, 1), (0, -1)};
        return 0;
    }
    
    1 回复  |  直到 2 年前
        1
  •  5
  •   Yash Sharma    2 年前

    当谈到你关于成对向量的列表初始化的问题时,你注意到这里的不同行为真的很酷。

    你的前两个例子很到位。在第一种情况下,您使用std::make_pair显式地创建对,这是在C++11之前创建对对象的标准方法,而且它仍然非常好地工作:

    std::vector<std::pair<int, int>> vpairs_first{std::make_pair(0, 1), std::make_pair(0, -1)};
    

    在第二种情况下,您将使用C++11中引入的统一初始化,这也是完全有效的,而且更简洁:

    std::vector<std::pair<int, int>> vpairs_second{{0, 1}, {0, -1}};
    

    现在,对于棘手的部分!第三个例子有点明白。您使用的是圆括号()而不是大括号{},并且在圆括号内,您有用逗号分隔的表达式:

    std::vector<std::pair<int, int>> vpairs_third{(0, 1), (0, -1)};
    

    在C++中,当用这样的逗号分隔表达式时,实际上是在使用逗号运算符,该运算符计算其两个操作数并返回第二个操作数的结果。因此(0,1)的计算结果为1,(0,-1)的计算值为-1。你实际上想在这里做的是这样的事情:

    std::vector<int> some_vector{1, -1};
    

    但这不是你想要的,因为vpairs_third应该是一个成对的向量,而不是int。所以编译器会混淆,并给你一个错误,因为你试图用int初始化一个向量对。

    坚持使用大括号{}进行列表初始化,以避免逗号运算符混淆,您将获得金牌。继续尝试C++,这是学习语言来龙去脉的好方法!