在C++中将char *转换为const char *
如何在C++中将char *转换为const char *?为什么程序1正在工作,但程序2不能?在C++中将char *转换为const char *
PROG 1(工作):
char *s = "test string";
const char *tmp = s;
printMe(tmp);
void printMe(const char *&buf) {
printf("Given Str = %s", buf);
}
PROG 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.
printMe
需要一个左值参照一个可变指针为const焦炭。
在第一个示例中,tmp
是一个类型为可变指向const char的左值,因此引用可以毫无问题地绑定到它。
在第二个示例中,(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);
}
最后,这是理性的东西一样是这样的:
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&'之间的区别吗? –
它们分别是:对const char指针的引用,对const char的指针以及对const char的引用。指针是存储内存地址的完整对象,而引用在概念上只是现有对象的新名称。参见[C++中指针变量和引用变量之间的区别是什么?](https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a -reference-variable-in)以获取更多信息。 –
非常感谢@Miles! –
这不是有效的C,它是C++。在* both *语言中,你做错了......指针's'是一个指向*只读*(在C++中为'const')字符数组的指针,所以's'应该是'const char * s =“test string”;' –
哦,好吧!我很抱歉,我正在尝试使用g ++进行编译。让我改变标题。 –
在Prog 2中没有定义tmp? –