对集合的密钥类型使用比较函数会导致运行时错误

时间:2015-05-28 16:26:12

标签: c++ c++11 set runtime-error decltype

我已阅读this个问题但对我没有帮助。

我的问题是:为set的密钥类型使用比较函数时,为什么会出现运行时错误?

multiset<Phone, decltype(comp)*> phones { Phone(911), Phone(112) };
              //^^^^^^^^^^^^^^^

在VC2013中,它为我提供了以上代码:

  

debugit.exe中0x73DECB49处的未处理异常:0xC0000005:访问冲突执行位置0x00000000。

这是一个产生错误的小例子:

#include <iostream>
#include <algorithm>
#include <string>
#include <set>
using namespace std;

struct Phone {
    Phone(long long const &num) : number{num} {}
    long long number;
};

// compare function:
bool comp(Phone const &n1, Phone const &n2) { return n1.number < n2.number; }

int main()
{   // The below line produces the runtime error.
    multiset<Phone, decltype(comp)*> phones { Phone(911), Phone(112) };
}

我看不出我在这里做错了什么。我用VC2013和g ++(GCC)4.9.1编译的结果都是相同的。

1 个答案:

答案 0 :(得分:2)

decltype(comp)*只是指向具有签名bool(Phone const&, Phone const&)的函数的指针。它的值初始化为nullptrstd::multisetstd::initializer_list构造函数使用此作为Compare对象的默认参数。由于您已使用空函数指针初始化std::multiset作为比较器,因此调用它可能会导致段错误。

要解决此问题,请提供Compare对象的有效实例,如下所示:

multiset<Phone, decltype(comp)*> phones {{ Phone(911), Phone(112)}, &comp};