对向量的列表初始化

问题描述 投票:0回答:1

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

我理解以下作品符合预期:

std::vector<std::pair<int, int>> vpairs_first{std::make_pair(0, 1), std::make_pair(0, -1)};
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++ c++11 stdvector std-pair list-initialization
1个回答
6
投票

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

你的前两个例子是正确的。在第一种情况下,您使用 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 应该是对的向量,而不是整数。因此编译器会感到困惑并给你一个错误,因为你试图用整数初始化一个对向量。

坚持使用大括号 {} 进行列表初始化,以避免逗号运算符混淆,这样你就很成功了。继续尝试 C++,这是学习该语言细节的好方法!

© www.soinside.com 2019 - 2024. All rights reserved.