列表整数对向量的初始化

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

我正在列表初始化一对整数的向量。 我理解以下作品符合预期:

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;
}
c++ c++11 stl list-initialization
1个回答
1
投票

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

你的前两个例子是正确的。在第一种情况下,您使用 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.