为什么我们不能使用以下 set 语法进行列表初始化<A, Less>?

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

我下面有简单的示例代码。

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

class A {

public:
   A() = default;
   A(int x) : _x(x) {}
   int getX() { return _x; }

private:
   int _x;

};

bool compare (A x, A y) {
   return x.getX()-y.getX();
}

using Less = bool (*)(A, A);

int main() {
   set <int> s1 = {1,2,3}; // <-- clause 1 - no issue!
   bool (*fnc)(A, A) = compare;
   set <A, Less> s2(fnc) = { A(1), A(2) }; // <-- clause 2. Expecting ";" at the end of declaration
   return 0;
}

为什么我不能列出初始化子句 2,而子句 1 没有问题?

c++ c++11 c++20
1个回答
0
投票

尝试

template<auto x>
uding val_t=std::integral_constant<decltype(x),x>;


set <A, val_t<compare>> s2 = { A(1), A(2) };

您现有的代码使用函数指针初始化 std set,然后尝试使用初始值设定项列表再次初始化它。您只能初始化一个对象一次。

这里我通过

val_t
类型传递了less函数,所以初始化的时候就不用传入了。

© www.soinside.com 2019 - 2024. All rights reserved.