隐式转换为const字符串引用失败

时间:2014-07-24 09:39:23

标签: c++

为什么将FooBar的函数参数从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;
}

3 个答案:

答案 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));