我有像
这样的功能 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 *&
作为参数
答案 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);
}