ISOC++说这些是模棱两可的,即使第一个最差的转换比第二个最差的转换好
为什么这是模棱两可的?
// In class declaration
template<typename T>
class threadsafe_list {
void for_each(std::function<void(T&)> _consumer);
void for_each(std::function<void(const T&)> _consumer) const;
}
// Calling for_each
threadsafe_list<bool> list;
std::function<void(const bool&)> print = [](const bool& _bool) {
std::cout << (_bool ? "True" : "False") << std::endl;
};
// Warning: for_each is ambiguous
list.for_each(print);
// This is OK
list.for_each([](const bool& _bool) { std::cout << (_bool ? "True" : "False") << std::endl; });
为什么上面的说法有歧义?for_each 之一用于 const 而另一个则不是。谢谢!
回答
第一次调用有两种可能的重载解析,每个都涉及转换:
- 选择第一个重载,转换
std::function<void(const bool&)>?std::function<void(bool&)> - 选择第二个重载,转换
threadsafe_list<bool>&?const threadsafe_list<bool>&
两种转换都不比另一种更好,因为它们适用于不同的参数。
对于第二个调用,一个比另一个更好,因为更差的一个转换两个参数(lambda 到std::function和listto const threadsafe_list<bool>&)。
要解决此问题,您可以添加另一个重载,它比原始两个重载中的任何一个都更匹配:
void for_each(std::function<void(T&)> _consumer) const;
或者,也可以std::function完全删除以确保参数完全匹配:
template <typename F>
void for_each(F _consumer);
template <typename F>
void for_each(F _consumer) const;