如果没有对临时对象的常量引用,它会被删除吗
Will temporary object be deleted if there is no const reference to it?
让我们看看这两个函数:
std::string get_string()
{
std::string ret_value;
// Calculate ret_value ...
return ret_value;
}
void process_c_string(const char* s)
{
std::cout << s << endl;
}
这里有两个可能的process_c_string
调用,参数由get_string
返回。
不绑定对
get_string
的返回对象的常量引用。process_c_string(get_string().c_str());
具有对
get_string
的返回对象的绑定常量引用。const std::string& tmp_str = get_string(); process_c_string(tmp_str.c_str());
我知道第二种方法是有效的,但第一种方法呢,标准对这种情况有什么看法?get_string
返回的临时对象会因为没有const reference
而在process_c_str
完成之前被删除吗?
注意:这两个版本在MSVC中都可以。
临时的生存期将扩展到创建它的完整表达式的长度。在您的情况下,临时文件将被销毁,但只有在对process_c_string
的调用完成之后。只要函数不存储指针供以后使用,就可以了。
在第二种情况(引用的绑定)中,该临时的生存期被扩展为引用的范围,但我建议在这种特定情况下不要使用这种模式。您可以通过创建一个用临时初始化的本地字符串来获得相同的效果,并且代码更简单。(从性能的角度来看,所有编译器都消除了代码中潜在的额外副本,因此成本是相同的)
相关文章:
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 使用函数引用指向节点的指针删除链表中的节点?
- unique_ptr实现接口时对已删除函数的引用
- 无法引用该函数" std:: variant <_Types...> operator =",因为此函数已被删除
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- unique_ptr,您引用的是已删除的函数
- 试图引用已删除函数数组的相等运算符
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 使用 future 时获取 C2280(尝试引用已删除的函数)
- 删除通过取消引用新对象初始化的对象
- C++引用已删除函数错误
- 是否可以删除取消引用的指针
- 删除引用时出现未分配释放的指针错误
- 从用户输入中删除引用结构/类成员变量
- 删除引用时的双重自由或损坏