在C++中将char*转换为const char*

11

如何在C++中将char*转换为const char*?为什么程序1可以工作,但程序2却不能?

程序1(有效):

char *s = "test string";
const char *tmp = s;
printMe(tmp);

void printMe(const char *&buf) {
    printf("Given Str = %s", buf);
}

程序2(无法工作)

char *s = "test string";
printMe((const char *)s);     // typecasting not working

void printMe(const char *&buf) {
    printf("Given Str = %s", buf);
}

我收到的错误:

x.cpp:10:15: warning: conversion from string literal to 'char *' is 
deprecated [-Wc++11-compat-deprecated-writable-strings]
char *s = "test string";
          ^
x.cpp:12:5: error: no matching function for call to 'printMe'
printMe(s);
^~~~~~~
x.cpp:6:6: note: candidate function not viable: no known conversion 
from 'char *' to 'const char *&' for 1st argument
void printMe(const char *&buf)
 ^
1 warning and 1 error generated.

谢谢。


1
那不是有效的C,而是C++。在两种语言中,你都做错了... 指针s是指向一个只读(在C++中为const)字符数组的指针,所以s应该是const char *s = "test string"; - Some programmer dude
哦,好的!对不起,我正在尝试使用g++编译。让我改一下标题。 - M. Rock
我认识@一些程序员,但我想知道是否有办法将char转换为const char或反之亦然? - M. Rock
我在想是否有办法将char *转换为const char *或反之亦然?--> @M.Rock 不是“工作”的const char *tmp = s;char *转换为const char *吗?因此,显然其中一条路径是成功的。 - chux - Reinstate Monica
2
const char &buf,&符号意味着它绑定到一个变量上,在第一种情况下,它是tmp。在第二种情况下,由于没有tmp,因此无法将char转换为绑定变量。如果printMe所做的全部都是printf,您不需要const char*& buf,只需要const char* buf即可。 - Tony J
显示剩余5条评论
1个回答

6

printMe接受一个左值引用,指向可变的指向常量字符的指针。

在您的第一个示例中,tmp是一种可变指向常量字符的指针类型的左值,因此可以将引用绑定到它而没有问题。
在您的第二个示例中,(const char*)s创建了一个临时的const char*对象。左值引用不能绑定到临时对象,因此会出现错误。如果将printMe更改为接受const char* const&,则无论是否进行显式转换,调用都将成功。

void printMe(const char * const& buf) {
    printf("Given Str = %s", buf);
}

int main() {
    char s[] = "test string";
    printMe(s);
}

点击此处在线查看

当然,如果你不想改变传递给 printMe 的对象(指针),那么根本没有理由使用引用。只需将其设置为接受 const char*

void printMe(const char * buf) {
    printf("Given Str = %s", buf);
}

int main() {
    char s[] = "test string";
    printMe(s);
}

在Coliru上实时演示

最终,这也是类似于这样的原因:

void doSomething(const std::string& s) {}
int main() {
    doSomething("asdf");
}

在此情况下起作用:

void doSomething(std::string& s) {}
int main() {
    doSomething("asdf");
}

无法。会创建一个临时对象,非const对象的引用无法绑定到临时对象。


感谢 @Miles 的澄清。您能告诉我 const char *&const char *const char & 之间的区别吗? - M. Rock
它们分别是:指向常量字符的指针的引用、指向常量字符的指针和常量字符的引用。指针是完整的对象,可以存储内存地址,而引用在概念上只是现有对象的新名称。有关更多信息,请参见C++中指针变量和引用变量之间的区别是什么? - Miles Budnek
非常感谢@Miles! - M. Rock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接