返回字符*到字符串
你可以这样做。但它会更加正确地说:
const char* func(){
return "String";
}
C++规范说,字符串文字被赋予静态存储持续时间。我无法链接到它,因为有几个版本的C++规范在线。 const correctness上的这个页面是我能找到的最佳参考。
科的ISO/IEC 14882 2.13.4(编程语言 - C++)表示:
字符串文字是由双引号所包围,任选的字符序列(如在2.13.2中定义的) 以字母“L”开头,如“...”或L“...”。不以L开头的字符串文字是普通的 字符串文字,也被称为窄字符串文字。一个普通的字符串文字的类型为“数组n”,其中n是下面定义的字符串的大小,并且是用给定字符初始化的 。 ...
是否所有字符串文字都是不同的(即,存储在非重叠对象中)是实现定义的。 尝试修改字符串文字的效果未定义。
常量不是分配在堆上,而是常量。你不需要销毁它。
不在现代编译器中。在现代编译器中,"String"
的类型为const char *
,由于const
不匹配,您无法将其分配给char *
。
如果您制作c
a const char *
(并更改函数的返回类型),则代码将是合法的。通常,字符串文字"String"
将被链接器放置在可执行文件的数据部分中,并且在很多情况下,将放在只读数据的特殊部分。
除C++中有一个特定的规则允许这种隐式转换以便与C代码向后兼容。虽然我不能说C++ 0x。 – 2010-08-24 13:36:58
而且没有理由为什么编译器不能在.text段中放置“String”。 – doron 2010-08-24 13:45:43
你可以做到这一点目前(虽然没有理由)。但是你不能用C++ 0x来做这件事。他们删除了字符串文字(类型为const char[N]
)的弃用转换为char *
。
请注意,对于字符串文字,此转换仅为。因此,以下两件事是非法的,其中第一个指定的阵列,并且其中第二个指定的指针进行初始化
char *x = (0 ? "123" : "345"); // illegal: const char[N] -> char*
char *x = +"123"; // illegal: const char * -> char*
GCC不正确,可同时接收,锵正确地拒绝两者。
你的意思是2.13.4/1。虽然我不能编辑它! – Chubsdad 2010-08-24 13:57:25