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

M. *_*ock 5 c++ pointers casting const reference

如何在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);
}
Run Code Online (Sandbox Code Playgroud)

编2(无效)

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

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

我收到的错误:

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.
Run Code Online (Sandbox Code Playgroud)

谢谢。

Mil*_*nek 5

printMe 接受一个指向 const char 的可变指针的左值引用。

在您的第一个示例中,tmp是一个指向 const char 的可变指针类型的左值,因此可以毫无问题地将引用绑定到它。
在您的第二个示例中,(const char*)s创建一个临时const char*对象。对可变对象的左值引用无法绑定到临时对象,因此会出现错误。如果您更改printMe为 take aconst char* const&那么无论是否进行显式转换,调用都会成功。

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

int main() {
    char s[] = "test string";
    printMe(s);
}
Run Code Online (Sandbox Code Playgroud)

住在 Coliru

当然,如果您不想更改传递给 的对象(指针)printMe,则根本没有理由使用引用。只需要一个const char*

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

int main() {
    char s[] = "test string";
    printMe(s);
}
Run Code Online (Sandbox Code Playgroud)

住在 Coliru

最后,这是同样的原因:

void doSomething(const std::string& s) {}
int main() {
    doSomething("asdf");
}
Run Code Online (Sandbox Code Playgroud)

在此期间工作:

void doSomething(std::string& s) {}
int main() {
    doSomething("asdf");
}
Run Code Online (Sandbox Code Playgroud)

才不是。创建了一个临时对象,对非常量对象的引用不能绑定到临时对象。