3

cppreference,我试图理解产生 xvalues 的表达式,我最终得到了这个摘要:

以下表达式是 xvalue 表达式:

  • ...
  • 在临时物化之后指定临时对象的任何表达式。

临时实现是:

任何完整类型 T 的纯右值都可以转换为相同类型 T 的 xvalue。这种转换通过使用临时对象作为其结果对象评估纯右值,从纯右值初始化类型 T 的临时对象,并产生一个表示临时对象。

根据我对上述引用的理解,临时实现涉及将纯右值转换为 xvalue 以初始化创建的临时值;这意味着无论何时实现纯右值,都会出现一个 xvalue 表达式。所以我发现自己必须了解prvalue何时具体化。然后我从cppreference检查了这个:

临时实现发生在以下情况:

  • 1-绑定对prvalue的引用时;
  • 2-当对类纯右值执行成员访问时;
  • 3- 对数组纯右值执行数组到指针的转换或下标时;
  • 4- 从花括号初始化列表初始化 std::initializer_list 类型的对象时;
  • 5- 当 typeid 应用于prvalue时
  • 6- 当 sizeof 应用于prvalue时
  • 7- 当纯右值作为废弃值表达式出现时。

请注意,从相同类型的纯右值(通过直接初始化或复制初始化)初始化对象时不会发生临时实现:此类对象直接从初始化程序初始化。这确保了“保证复制省略”。

任何人都可以通过简单的例子帮助我在情况 3、4 和 7 中如何涉及 xvalue 表达式。

4

1 回答 1

2

情况 3、4 和 7。

7(丢弃的表达式)是最简单的:

42; // materialize and discard
std::string{"abc"}; // materialize and discard

3(对数组右值做事)需要知道如何制作它们

using arr_t = int[2][3];
int a = arr_t{}[0][0]; // have to materialize to be able to subscript

4(制作 std::initializer_list)是它在锡上所说的

std::initializer_list<std::string>{
  "abc"s,
  "def"s
}; // have to materialize the two strings
   // to place them in the secret array pointed to by the list
于 2022-02-17T05:19:04.230 回答