std::string {} = “hi”;诱导临时物化?

Does std::string {} = "hi"; induce temporary materialization?

提问人:domdrag 提问时间:2/26/2023 最后编辑:Jan Schultkedomdrag 更新时间:9/9/2023 访问量:122

问:

动机是什么 表达式 std::string {} = “...”意味 着?;

左手边是否会引起临时物化,如果确实如此,它属于下面提到的哪些场景std::string {} = "hi";

在以下情况下会发生临时物化:

  • 1- 将引用绑定到 PR值时;
  • 2- 当对类 prvalue 执行成员访问时;
  • 3-执行数组到指针转换时 或对数组 prvalue 进行下标;
  • 4- 从 braced-init-list 初始化 std::initializer_list 类型的对象时;
  • 5- 当 typeID 应用于 prvalue 时
  • 6- 当 sizeof 应用于 prvalue 时
  • 7- 当 PR值显示为丢弃值时 表达。

我希望这会导致临时的物化,因为我们创建了一个临时的对象,但找不到哪种场景适合这里。std::string {}

C++ C++17 语言律师 临时对象

评论

0赞 user12002570 2/26/2023
另请参阅此答案: std::string{} = “hello”s; 编译
0赞 domdrag 2/26/2023
关闭问题的人甚至在关闭问题之前会费心阅读问题吗?嗯。
0赞 user12002570 2/26/2023
A) 没有临时物化,从您列出的要点中已经可以看出 B) 允许它的原因是因为可以分配类 rvalue。
0赞 domdrag 2/26/2023
@JasonLiam 你还没读过我的问题......
1赞 user12002570 2/26/2023
我当然做到了。你要问的是这里是否涉及临时物化。答案是否定的。现在,如果你仔细阅读这些骗局,你就会明白为什么没有暂时的物化,因为通过阅读这些答案,你就会明白引擎盖下发生了什么。在写评论之前仔细阅读复制品。提示:可以分配类 rvalue。

答:

3赞 T.C. 2/26/2023 #1

表达式(在重载解析后)转换为 [over.match.oper]/2,此时临时具体化将应用于列表中的第二个点。(在标准术语中,[expr.ref]/2 表示它的第一个操作数是 glvalue,而 [basic.lval]/7 在这样的上下文中出现 prvalue 时应用临时具体化转换。std::string{}.operator=("hi").