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 时,它不会变得无效,例如通过使用 staticnew:

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

相同的转换