C++ C+中的临时实例+;使用字符串和c字符串

C++ C+中的临时实例+;使用字符串和c字符串,c++,C++,所以我有这个代码: void块(std::string URL,std::string auth) { const char*cstr_url=url.c_str(); std::string s=(“授权:+auth”); const char*auth_header=s.c_str(); (··等等···) } 如果我们在调试模式下查看“autos”字段,一切看起来都很好: 但是如果我们试图以(“Authorization:+auth)是String类的临时实例的方式更改代码,以避免声明

所以我有这个代码:

void块(std::string URL,std::string auth)
{
const char*cstr_url=url.c_str();
std::string s=(“授权:+auth”);
const char*auth_header=s.c_str();
(··等等···)
}
如果我们在调试模式下查看“autos”字段,一切看起来都很好:

但是如果我们试图以
(“Authorization:+auth)
是String类的临时实例的方式更改代码,以避免声明
s
变量(从而节省空间-至少,这是我的目的-):

void块(std::string URL,std::string auth)
{
const char*cstr_url=url.c_str();
const char*auth_header=(“授权:+auth).c_str();
(··等等···)
}
…我们在调试“autos”字段中得到的是完全不同的内容(很多字符):

我认为C++可以支持这些东西(我不知道它们是如何被技术调用的),我假设“隐式实例”是一个原始名称。我发誓Java可以支持这些“隐式实例”

所以真正的问题是,这里发生了什么?有什么办法可以避免声明
s
变量吗?

调试版本非常友好地保留了在该语句之后不再存在的
char
s,而不是让它们处于您可能认为一切正常的状态

此类C++的名称是“rValuy”(具体地说是“PROVALUE”),表示表达式“代码>(“授权:”+AUTH)< /代码>。右值是即将被销毁的对象


auth_header
现在是一个无效指针,对它执行任何操作(除了重新分配它)都有未定义的行为。

const char*auth_header=(“授权:”+auth).c_str()
bind
auth_header
到在表达式末尾销毁的临时文件。您有一个悬空指针。您将如何修复此悬空指针@RichardCriten您必须保持
(“授权:“+auth)
的结果处于活动状态,只要您想使用
auth\u header
来解决像XY问题一样的问题--为什么要使用
const char*
和c\u str()?它几乎只是为了与旧的C接口交互而存在的,不应该在其他情况下使用。@ElJaviLuki:在这种情况下,您应该只在libcurl调用的参数中直接调用C_str()——不要创建
const char*
tempvars。