在我看来,它们是一样的。但在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);
我不知道为什么?
答案 0 :(得分:4)
第一个例子:
multiset<int, greater<int> > ms1;
这表示ms1
是std::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>{});
说的是ms2
是std::multiset
,存储int
,并使用std::less<int>
类型的比较仿函数。然后,您将std::greater<int>
的实例传递给构造函数。 std::less<int>
和std::greater<int>
是不同的类型。您不能将一个实例传递给期望另一个实例的函数。