咨询C++中未绑定变量的对象初始化用法及官方文档示例
C++ 匿名临时对象用法说明
你用到的这种不绑定变量的对象初始化写法,在C里叫做匿名临时对象,是C标准明确支持的核心语法特性——C98就已支持()构造方式,C11及以后新增了列表初始化{}的创建形式。
核心语法说明
C++允许直接构造不绑定到任何命名变量的对象,这类临时对象的生命周期默认局限于当前表达式:表达式执行完毕后,临时对象会被自动销毁。
对应你的示例解析
- 字符串比较示例
if (std::string{params["name"]} != std::string{userDb["name"]}) { res.code = 401; res.body = "{\"success\":false}"; }
这里std::string{params["name"]}和std::string{userDb["name"]}都是通过列表初始化创建的匿名临时std::string对象,直接用于相等性比较,无需额外定义变量存储,表达式结束后两个临时对象自动销毁。
- 临时对象调用成员方法示例
RedisDao{}.get(key);
先通过RedisDao{}构造一个匿名的RedisDao临时对象,紧接着调用其get成员方法,方法执行完成后,这个临时对象会被立即销毁。
C++文档中的典型用法示例
以下是C++标准及常用参考文档中出现的同类用法:
- 用临时对象作为函数参数:
// 传递临时vector对象给函数 void process_data(const std::vector<int>& data); process_data(std::vector<int>{1, 3, 5, 7}); - 临时对象直接调用成员函数:
// 创建临时string并获取其长度 std::size_t len = std::string("example text").size(); - 临时对象参与运算或条件判断:
// 临时string与输入值比较 if (std::string("admin") == input_username) { // 执行权限操作 }
注意事项
- 临时对象默认生命周期仅在当前表达式内,若将其绑定到
const引用,生命周期会延长至引用的生命周期结束:const std::string& temp_str = std::string("hello"); // temp_str的生命周期会持续到当前作用域结束 - 若临时对象的成员方法返回对象内部的引用/指针,需注意悬垂引用问题(比如
RedisDao{}.get(key)如果返回内部指针,调用后对象销毁,指针会失效)。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

