无法初始化类型“ std :: string&”不是const限定的引用

问题描述

| 当我尝试编译以下函数时,出现错误。
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\";
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...