1

我有一个类似的功能

    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 *&"

如果我更改foovoid foo(const char *),则没有错误不能const char *&用作参数

4

2 回答 2

2

您收到错误,因为转换是非法的。它非法的原因很简单:它const不需要const_cast.

作为禁止它的一个例子,想象一下foo

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

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

如果您不打算修改strin foo,请按值传递。如果你有,通过引用传递将有效char const* const&,但没有理由在这里使用它。它之所以有效,是因为附加的 const 意味着您可以将一个临时绑定到它(例如foo( "hello" ),其中参数是由char const[6]to 转换产生的临时结果char const*,并且foo( h )有效,因为隐式 const 转换将有效(在 C++ 中,但是不在 C 语言中!),只要您在任何地方添加 const (而不仅仅是在一个级别)。

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

编辑:

只是要清楚,没有问题:

void f( char const*& str );

但是你只能用 type 的左值来调用它char const*;其他任何事情都会导致非法的隐式 const 转换,或者尝试使用右值初始化非常量引用,这是非法的。

于 2013-04-11T08:40:04.700 回答
1

这将起作用

int main()
{
    const char *h = "hello";
    foo(h);
}
于 2013-04-11T08:14:17.030 回答