为什么我不能用谓词的实例化来构造 std::set,但我可以分配一个以这种方式构造的 std::set?

Why can't I construct std::set with an instantiation of a predicate, but I can assign a std::set constructed that way?

本文关键字:set std 一个以 分配 我可以 方式构 实例化 为什么 不能 谓词      更新时间:2023-10-16

所以我得到了一个数组(0 - n),其中包含我希望std::set用于排序的值。数组类型为unsigned int cost[n]。

我使用以下函子进行排序:

struct ProxySorter {
  ProxySorter(const unsigned* arr) : proxy_array(arr) {}
  bool operator()(const unsigned& a, const unsigned& b) const {
    return proxy_array[a] < proxy_array[b];
  }
  const unsigned* proxy_array;
};

问题来了…当我构造集合时,这是合法的:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost));

我没有得到错误,一切都如预期的那样工作。但这似乎是黑客和马虎。

但是,这显然是不合法的:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost));

尝试用ProxySorter(cost)构造它会导致一堆错误,对于每个set成员调用都说这样的东西:

error: request for member erase in node_queue,是of非类类型std::set

Most-vexing-parse。您需要另一对括号:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost)));

否则,它将被解释为一个函数的声明,返回您的集合类型,并接受一个名为costProxySorter类型的参数。