Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 选择了错误的函数_C++_Visual C++ - Fatal编程技术网

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
替换
t
const char*
被传递。只是想法。