问题描述
|
当我尝试编译以下函数时,出现错误。
string& foo(){
return \"Hello World\";
}
Error:
1 IntelliSense: a reference of type \"std::string &\" (not const-qualified) cannot be initialized with a value of type \"const char [12]\"
解决方法
您的代码有两个问题。首先,
\"Hello World!\"
是一个
char const[13]
,而不是std::string
。所以编译器必须
(隐式地)将其转换为std::string
。一个的结果
转换是暂时的(用C ++来说是右值),您不能
使用临时初始化对非常量的引用。第二个是
即使您可以(或者您声明函数返回一个
对const的引用),您正在返回对以下内容的引用
将立即超出范围(并因此而被破坏);任何使用
结果引用将导致未定义的行为。
真正的问题是:为什么要引用?除非你真的
指的是寿命更长的对象中的某物
目的是让客户端代码对其进行修改(通常不是一个好主意,但是
有明显的例外,例如向量的operator[]
),您应该
按值返回。
,\“ Hello World \”不是字符串,而是一个char数组。 C ++编译器需要将其转换为字符串值,而不是字符串引用(因为它不是字符串),因此您的函数应如下所示:
string foo(){
return \"Hello World\";
}
为了扩展(在OP的请求下),编译器执行以下操作:
string foo(){
char a[] = \"Hello World\";
string s( a );
return s;
}
值s由std :: string复制构造函数从函数中复制出来。
,您正在指示编译器返回从char数组“ Hello World \”创建的临时std :: string。它需要将其放在某个地方,并请人负责清理。您可以通过以下几种方式做到这一点:
返回一个auto_ptr
返回一个字符串对象
返回一个对字符串对象的const引用(尽管这确实让我想到了谁清理它的问题?)
(仅c ++ 0x)返回对std :: string的右引用。 (std :: string &&)
第二个可能是最简单的。编译器将使用RVO(返回值优化)来删除由其调用的副本。
,就是这样
const string foo() {
return string(\"Hello World\");
}
,我想你要:
string foo(){
return \"Hello World\";
}