gpt4 book ai didi

c++ - 不明确的重载、隐式转换和显式构造函数

转载 作者:行者123 更新时间:2023-12-03 15:13:42 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Calling an explicit constructor with a braced-init list: ambiguous or not?

(2 个回答)


6 个月前关闭。




考虑以下小程序:

#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 拒绝编译它:它说调用 g({})a.f({})不明确。 Clang 编译这个没有提示。
在我看来 g(const A&)不应在重载决议中考虑,因为不允许从无参数进行隐式转换: A::A()被标记为显式。
我不相信错误不是我的,无论如何,我想找到一个解决方法。
是否有另一个默认生成的构造函数可能是我的问题的根源?
您可以在 compiler explorer 上试用.
SO post引起了我的注意。它的答案告诉我们哪个编译器是正确的:它是 GCC。但它并没有告诉我们如何使用这些重载规则获得所需的行为。

最佳答案

你说得对,这似乎是一个错误。下面注释掉的行无法编译的确切原因是不应该有歧义。
使用 std::initializer_list 为您提供了解决方法:

#include <fmt/core.h>
#include <vector>

class A {
int a;
int b;

public:
explicit A() = default;
A(int _a, int _b) : a(_a), b(_b) {fmt::print("Aab\n");}

void f(const A& a) { fmt::print("A\n"); }
void f(std::vector<int> a) { fmt::print("vector\n"); }
void f(std::initializer_list<int> l) {
return f(std::vector<int>(l));
}
};
void g(const A& a) { fmt::print("A\n"); }
void g(std::vector<int> a) { fmt::print("vector\n"); }
void g(std::initializer_list<int> a) {return g(std::vector<int>(a)); }

int main() {
A a(1,2);
A a2 = A();
//A a3 = {};
a.f({});
g({});
return 0;
}

关于c++ - 不明确的重载、隐式转换和显式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66228430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com