std::string {} = "hi"; 是否触发临时物化?属哪种场景?
std::string {} = "hi";的临时物化问题解析 问题核心
表达式std::string {} = "hi";的左操作数std::string {}是否触发临时物化?如果是,对应cppreference列出的哪类场景?
cppreference定义的临时物化场景如下:
临时物化发生在以下场景:
- 1- 将引用绑定到纯右值(prvalue)时;
- 2- 对类纯右值执行成员访问时;
- 3- 对数组纯右值执行数组到指针转换或下标操作时;
- 4- 用花括号初始化列表初始化std::initializer_list类型的对象时;
- 5- 对纯右值应用typeid时;
- 6- 对纯右值应用sizeof时;
- 7- 纯右值作为丢弃值表达式出现时。
结论与分析
std::string {}会触发临时物化,属于上述第2种场景。
具体原因:
std::string {}是std::string类型的纯右值(prvalue),本身没有实体对象。- 赋值表达式
std::string {} = "hi"的本质是调用std::string的成员赋值运算符:std::string{}.operator=(const char*)。 - 要对类纯右值执行成员访问(调用成员函数
operator=),必须先将该纯右值物化为临时对象,这正好匹配cppreference列出的第2种临时物化触发场景。
物化后的临时对象会被赋值操作修改,在整个表达式执行完毕后自动销毁。
内容的提问来源于stack exchange,提问作者domdrag
相关产品推荐
相关产品推荐

