C++ 选择了错误的函数
我试图清理一些使用C++ 选择了错误的函数,c++,visual-c++,C++,Visual C++,我试图清理一些使用char*和std::string的代码,但遇到了以下代码说明的问题 void Foo( int xIn , const std::string & fooIn ) { std::cout << "string argument version called \n"; } void Foo( int xIn , bool flagIn = true ) { std::cout << "bool argument version
char*
和std::string
的代码,但遇到了以下代码说明的问题
void Foo( int xIn , const std::string & fooIn )
{
std::cout << "string argument version called \n";
}
void Foo( int xIn , bool flagIn = true )
{
std::cout << "bool argument version called \n";
}
int main()
{
int x = 1;
Foo( x , "testing" );
return 0;
}
void Foo(int xIn,const std::string&fooIn)
{
std::cout尽管这种行为令人惊讶,但编译器是兼容的:char*
到bool
的转换优先于到std::string
的转换
阅读更多
<> P>精确的规则在C++标准中被阐明。它们是惊人的复杂,但是下面的段落在这里是至关重要的:
C++1113.3.3.2隐式转换序列排序[over.ics.rank]
二,
比较隐式转换序列的基本形式时(如
定义见13.3.3.1)-标准转换顺序(13.3.3.1.1)为
比用户定义的转换序列更好的转换序列
或省略号转换序列
char*
-to-bool
需要“标准转换序列”,而char*
-to-字符串
需要“用户定义的转换序列”因此,前者是首选。它们都是潜在的匹配,但编译器首选bool
版本,因为为了匹配字符串
版本,需要用户提供(或在本例中,库提供)转换函数
如果您确实想这样做,为const char*
提供重载可以让您达到以下目的:
void Foo( int xIn, const char* in)
{
return Foo( xIn, string(in) );
}
我想,通过这样做,编译器很有可能会对其执行相当多的优化。一个简单的修复方法是将bool
更改为int
——有一个从bool
指针到int
bool
到int
的隐式转换这不是问题,因此通过bools的现有代码将继续工作
遗憾的是,这会影响代码可读性,因为它掩盖了参数的意图。查看清理格式和删除不相关的窗口内容。通常,我避免在C++中进行隐式转换,因为它很容易得到一些意外行为(bug)。.我在问题中提到…我在清理char*版本开始时遇到了这个问题with@Vlad..安全bool的替代方案是什么?@vlad:行为不端的类型是内置的。你是什么意思?@vlad:当你希望用户定义的类型提供到bool的转换时,该选项很有用。在这里,转换是在两个基本类型之间进行的,因此安全bool成语不适用。@UncleBens我的意思是-因此,您可以使用此包装来避免ADL中的char*vs bool问题,而不是使用内置bool。@LucTouraille:您是对的。我的意思是,当用户真正想要bool时,在方法中用某种Safebool
替换tconst char*
被传递。只是想法。