我有一个重载的函数。其中 2 个过载是
void foo(std::string_view v);
void foo(MyClass m);
哪里MyClass
有来自 的转换构造函数std::string
。如何强制呼叫foo(std::string{})
第一个呼叫?现在编译时不会出现错误:
错误:重载的 'foo(std::__cxx11::basic_string&)' 的调用不明确
我有一个重载的函数。其中 2 个过载是
void foo(std::string_view v);
void foo(MyClass m);
哪里MyClass
有来自 的转换构造函数std::string
。如何强制呼叫foo(std::string{})
第一个呼叫?现在编译时不会出现错误:
错误:重载的 'foo(std::__cxx11::basic_string&)' 的调用不明确
这是我的示例代码:
#include <type_traits>
template <bool B>
struct S {
// #1
// template <bool C = B, class = std::enable_if_t<!C>>
// operator S<true>() const { return {}; }
// #2
// operator S<true>() const { return {}; }
};
int main() {
S<true> b1;
S<false> b2;
}
当使用 g++ ( https://godbolt.org/z/P46qE8EGG ) 编译时,无论启用选项 #1、选项 #2 还是两者都启用,我都不会收到警告。当我启用 #2 时,我希望收到一个警告,指出它是一个自转换函数,但也许 g++ 没有这样的警告。
真正的问题是用 clang 编译时。仅当我启用 #1 时,我才会收到以下警告:
错误:永远不会使用将“S”转换为其自身的转换函数[-Werror,-Wclass-conversion]
启用 #2 不会触发此警告,禁用b1
或的实例化也b2
不会阻止它。到底是怎么回事?这是 clang 的错误吗?
编辑: 我具体指的是为什么#1 产生警告。其他信息旨在展示我试图将问题缩小到更小的工作示例的尝试