考虑以下简单程序:
GCC 10.2拒绝编译它:它说对和的调用是不明确的。Clang编译没有抱怨。
我认为不应该在重载决议中被考虑,因为从无参数的隐式转换是不允许的:标记为显式。
我不确定错误是否属于我,并且无论如何,我都希望找到一种解决方法。
是否有另一个默认生成的构造函数可能是我的问题来源?
您可以在编译器资源管理器上尝试它。
#include <vector>
class A {
int a;
int b;
public:
explicit A() = default;
A(int _a, int _b) : a(_a), b(_b) {}
int f(const A& a) { return 0; }
int f(std::vector<int> a) { return 1; }
};
int g(const A& a) { return 2; }
int g(std::vector<int> a) { return 3; }
int main() {
A a(1,2);
// a.f({}); //ambiguous according to gcc
g({}); //ambiguous according to gcc
return 0;
}
GCC 10.2拒绝编译它:它说对和的调用是不明确的。Clang编译没有抱怨。
我认为不应该在重载决议中被考虑,因为从无参数的隐式转换是不允许的:标记为显式。
我不确定错误是否属于我,并且无论如何,我都希望找到一种解决方法。
是否有另一个默认生成的构造函数可能是我的问题来源?
您可以在编译器资源管理器上尝试它。
我注意到了这篇 Stack Overflow 帖子。它的答案告诉我们哪个编译器是正确的:是 GCC。但它并没有告诉我们如何使用那些重载规则来获得所需的行为。
std::vector
变量,gcc会抱怨无法使用A
的显式构造函数。 - Slava