return 单个字符文字作为指针
return single char literal as pointer
虽然以下函数适用于 g++ 4.8.3(使用 C++11)
char* fn() {
return '[=11=]';
}
clang++ 3.6(使用 C++11)产生以下错误:
cannot initialize return object of type 'char *' with an rvalue of type 'char'
那么为什么会有这种差异?如何才能让这两种编译器都发挥作用?
While the following function works with g++ 4.8.3 [...]
函数通过编译并不意味着它真的有效。代码 return 是一个转换为指针的字符常量。
如果你想 return 一个指向 '[=12=]'
的指针,你需要在内存中的某个地方分配它,当你的函数 returns 时,它不会变得无效,例如通过使用 static
或 new
:
char* fn1() {
static char res = '[=10=]';
return &res;
}
或
char* fn2() {
char *res = new char;
*res = '[=11=]';
return res;
}
fn1
的调用者需要小心他们对结果指向的 char
所做的更改,因为它在所有调用者之间共享。
另一方面,fn2
的调用者必须在处理完结果后调用 delete
,以避免内存泄漏。
您的代码不会将 char 转换为 char *,而是将 char '\0' 提升为 nullptr。它进行与普通 return 0
相同的转换
虽然以下函数适用于 g++ 4.8.3(使用 C++11)
char* fn() {
return '[=11=]';
}
clang++ 3.6(使用 C++11)产生以下错误:
cannot initialize return object of type 'char *' with an rvalue of type 'char'
那么为什么会有这种差异?如何才能让这两种编译器都发挥作用?
While the following function works with g++ 4.8.3 [...]
函数通过编译并不意味着它真的有效。代码 return 是一个转换为指针的字符常量。
如果你想 return 一个指向 '[=12=]'
的指针,你需要在内存中的某个地方分配它,当你的函数 returns 时,它不会变得无效,例如通过使用 static
或 new
:
char* fn1() {
static char res = '[=10=]';
return &res;
}
或
char* fn2() {
char *res = new char;
*res = '[=11=]';
return res;
}
fn1
的调用者需要小心他们对结果指向的 char
所做的更改,因为它在所有调用者之间共享。
另一方面,fn2
的调用者必须在处理完结果后调用 delete
,以避免内存泄漏。
您的代码不会将 char 转换为 char *,而是将 char '\0' 提升为 nullptr。它进行与普通 return 0