“multiset <int,greater <int =”“>&gt; ms1”和“multiset <int> ms2(greater <int>())”之间的区别是什么?

时间:2017-10-03 23:54:55

标签: c++ multiset

在我看来,它们是一样的。但在Visual Studio 2015中,它们肯定是不同的。

//Ok, work properly
multiset<int, greater<int> > ms1;
ms1.insert(10);
ms1.insert(20);

//error, why?
multiset<int> ms2(greater<int>());
ms2.insert(30);
ms2.insert(40);

我不知道为什么?

1 个答案:

答案 0 :(得分:4)

第一个例子:

multiset<int, greater<int> > ms1;

这表示ms1std::multiset,存储int,并使用std::greater<int>类型的比较仿函数。你遗漏了构造函数参数,因此仿函数的实例是一个默认构造参数,就像你传递std::greater<int>{}一样,如下所示:

multiset<int, greater<int> > ms1(greater<int>{});

在您的第二个示例中:

multiset<int> ms2(greater<int>());

这个有点棘手。这里有两个问题。第一个涉及所谓的“最令人烦恼的解析”。它已被多次回答,因此我将简单地链接到其中一个答案。 Most vexing parse: why doesn't A a(()); work?

因此,我们假设您理解这一点,并相应地修改您的代码:

multiset<int> ms2(greater<int>{});
// or this
multiset<int> ms2((greater<int>()));

在这种情况下,您已经省略了比较仿函数的类型,并且使用了默认值。默认值为std::less<int>。所以上面这行等同于:

multiset<int, std::less<int> > ms2(greater<int>{});

说的是ms2std::multiset,存储int,并使用std::less<int>类型的比较仿函数。然后,您将std::greater<int>的实例传递给构造函数。 std::less<int>std::greater<int>是不同的类型。您不能将一个实例传递给期望另一个实例的函数。