gpt4 book ai didi

c++ - boost::variant 和函数重载决议

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:12 27 4
gpt4 key购买 nike

以下代码无法编译:

#include <boost/variant.hpp>

class A {};
class B {};
class C {};
class D {};

using v1 = boost::variant<A, B>;
using v2 = boost::variant<C, D>;

int f(v1 const&) {
return 0;
}
int f(v2 const&) {
return 1;
}
int main() {
return f(A{});
}

gcc 和 clang 都提示:

test1.cpp: In function ‘int main()’:
test1.cpp:18:17: error: call of overloaded ‘f(A)’ is ambiguous
return f(A{});
^
test1.cpp:18:17: note: candidates are:
test1.cpp:11:5: note: int f(const v1&)
int f(v1 const&) {
^
test1.cpp:14:5: note: int f(const v2&)
int f(v2 const&) {

既然不可能从 A 实例构造一个 v2 对象,为什么编译器在重载决策期间给予两个函数相同的优先级?

最佳答案

问题出在构造函数上

template<typename T>
variant(const T&)

boost::variant。下面的代码在没有任何魔法的情况下重现了这个问题:

struct C {};

struct A {
A(const C&) {}

template<typename T>
A(const T&) {}
};
struct B {
template<typename T>
B(const T&) {}
};

int f(const A&) {
return 0;
}
int f(const B&) {
return 1;
}
int main() {
return f(C{});
}

我认为 variant 构造函数只有在argument 实际上可以转换为 arguments,你可能想要将其作为错误提出。

关于c++ - boost::variant 和函数重载决议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791319/

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