C++ 这是确保隐式类型转换不会发生的合法方法吗

C++ 这是确保隐式类型转换不会发生的合法方法吗,c++,c++11,C++,C++11,这是确保隐式类型转换不会发生的合法方法吗 #include <string> #include <iostream> void func(std::string s) { std::cout << "Thanks for the string\n"; } template<class T> void func(T)=delete; int main() { func("test1"); // str.cc: In function

这是确保隐式类型转换不会发生的合法方法吗

#include <string>
#include <iostream>

void func(std::string s)
{
   std::cout << "Thanks for the string\n";
}
template<class T>
void func(T)=delete;

int main()
{
   func("test1");
// str.cc: In function ‘int main()’:
// str.cc:13:16: error: use of deleted function ‘void func(T) [with T = const char*]’
//     func("test1");
//     ^
//  str.cc:9:6: error: declared here
//  void func(T)=delete;
//       ^
//
   func(std::string("test2"));
   return 0;
}
#包括
#包括
void func(标准::字符串s)
{
std::cout在我看来不错


答案也是如此。

是的,该方法确保不允许隐式转换。但是,它也意味着该属性不是仅由
void func(string)
的定义产生的。因此,为了向读者澄清这一点,您可以将其设置为更加独立的,如下所示:

template <typename T, typename U> using RequireExplicit = enable_if_t<is_same<T, U>>;

template <typename T, typename = RequireExplicit<T, string>>
void func(T){}
使用RequireExplicit=enable\u if\u t; 模板 void func(T){}
这应该是一个评论。@DavidRodríguez dribeas问题是“这是一个合法的方法…”,而这个答案是“是的”,这是一个非常有效的答案。@cdhowie:你是对的,我不知道我是如何误读这个问题的:)(出于某种原因,我认为问题是如何阻止隐式转换)@DavidRodríguez dribeas-这是一条评论。遵守最不令人震惊的规则。这样做是毫无意义和奇怪的。这只会让读者困惑,并让他们怀疑作者是否知道他们在做什么。我会认真地问自己WTF是否看到了这段代码,因为它会导致歧义错误,除非有一个非模板verload来消除歧义。这也是“专门化”函数模板的错误方式。最好的情况是,这种“文档”是多余的,更可能是误导性的。不要这样做。@CrazyEddie我同意这有点不和谐。但它可以变得更容易接受(编辑)但是,你关于歧义错误的观点似乎是反对这种用法的有力理由。是的,如果
func(string),它不会导致歧义
之所以存在,是因为该函数将覆盖此定义。但该函数要么就在那里,要么就在其他地方。如果它就在那里,那么此文档就没有帮助。如果它在其他地方,而我不知道,那么我将花费数小时试图弄清楚编写此“重载”的人的意图迪德。