问题标签 [prvalue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
108 浏览

c++ - 初始化对象和计算值有什么区别?

来自工作草案,C++ 编程语言标准[basic.lval/5]

泛左值的结果是表达式表示的实体。prvalue的结果是表达式存储到其上下文中的值;类型为cv void的纯右值没有结果。结果为值V的纯右值有时被称为具有或命名为值V。prvalue的结果对象是prvalue初始化的对象;用于计算内置运算符的操作数的值的非丢弃纯右值或类型为cv void的纯右值没有结果对象。

[注4:除非prvalue是decltype-specifier的操作数,类或数组类型的prvalue总是有一个结果对象。对于类型不是cv void的被丢弃的纯右值,临时对象被物化;见 [expr.context]。——尾注]

初始化对象和计算值有什么区别?

每一个的一些例子将不胜感激。

0 投票
1 回答
75 浏览

c++ - 指定临时对象的表达式如何是 xvalue 表达式?

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 表达式。

0 投票
1 回答
39 浏览

c++ - 引用如何绑定到纯右值?

cppreference 说:当引用绑定到纯右值时会创建一个临时对象。它们是指 const 左值引用和右值引用吗?:

临时对象在prvalue被具体化时创建,以便它可以用作glvalue,这在以下情况下发生(自C++17起):

  • 绑定对纯右值的引用

如果他们的意思是,右值引用和 const 左值引用绑定到相同类型的纯右值会创建一个临时值吗?我的意思是,这是否正在发生:

0 投票
1 回答
33 浏览

c++ - 创建prvalue的转换如何创建临时对象?

来自cppreference

在以下情况下会创建临时对象:

  • 创建纯右值的转换(包括 T(a,b,c) 和 T{})

这什么时候会发生?(示例将不胜感激)

“包括 T(a,b,c) 和 T{}”是什么意思?

static_cast<T>(e),const_cast<T>(e)和转换总是评估为纯右值dynamic_cast<T>(e)吗?reinterpret_cast<T>(e)