无法从char *转换为const char *&

时间:2013-04-11 08:11:17

标签: c++ reference const

我有像

这样的功能
    void foo(const char *&str)
    {
         cout<<str<<endl;
    }

用过:

    void main()
    {
        foo("hello");
        char *h = "hello"
        foo(h);
    }

但两者都有错误

"can't convert from const char[] to const char *&"

如果我将foo更改为void foo(const char *),则无法使用const char *&作为参数

2 个答案:

答案 0 :(得分:2)

您收到错误,因为转换是非法的。原因 这是非法的很简单:它会在不要求的情况下中断const 一个const_cast

作为禁止它的原因的一个例子,假设foo是:

void
foo( char const*& str )
{
    str = "abc";
}

int
main()
{
    char* h;
    foo( h );
    *h = '1';
}

如果您不打算在str中修改foo,请按值传递。 如果您有char const* const&,则按引用传递将有效 但是没有理由在这里使用它。它的工作原理是因为 附加const意味着您可以将临时绑定到它(如 在foo( "hello" )的情况下,参数是。{ 由char const[6]转换为的临时结果 char const*foo( h )有效,因为隐式const 转换将起作用(在C ++中,但不在C中!),只要你 在任何地方添加const(而不仅仅是在一个级别)。

此外,您的代码还使用不推荐的转换来初始化 h。你应该在这里收到警告。并且void main是一个 错误,不应该编译。

编辑:

为了清楚起见,没有问题:

void f( char const*& str );

但你只能用char const*类型的左值来调用它; 其他任何东西都会导致非法的隐式const 转换,或尝试用a初始化非const引用 rvalue,这是非法的。

答案 1 :(得分:0)

这将有效

int main()
{
    const char *h = "hello";
    foo(h);
}