为什么将Foo
和Bar
的函数参数从const
更改为non-const
会导致不同的编译错误?
或者换句话说:为什么Foo(false)
没问题,而Bar(false)
会导致编译错误?
#include <string>
void Foo(const std::string &test)
{
}
void Bar(std::string &test)
{
}
int main(int , char* [])
{
Foo(false);
Bar(false); // error C2664: 'Bar' : cannot convert parameter 1 from 'bool' to 'std::string &'
return 0;
}
答案 0 :(得分:6)
当您使用bool
参数调用函数时,编译器将寻找从bool
到参数具有的任何类型的可行转换:const std::string &
在第一种情况下,{ {2}}在第二种情况下。
std::string &
可以从std::string
构建, const char *
是一个整数常量0,可以隐式转换为(它将导致{{1} })。因此将构造一个临时字符串并绑定到const引用。
使用非const版本的引用无法做同样的事情,因为临时对象不是左值。
答案 1 :(得分:1)
Foo(false)
没问题,因为string
有隐式构造函数,收到const char*
,因此false
会转换为0
,会被发送到Bar(false)
C-TOR。
{{1}}不正确,因为您无法将临时值绑定到左值引用。
答案 2 :(得分:0)
因为false
可以转换为0
,并且可以将其转换为const char *
(尤其是NULL
)。
所以,你的代码等于:
Foo(string((const char *)NULL));