问题标签 [full-expression]

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 投票
2 回答
3528 浏览

c++ - 临时工的寿命

以下代码工作正常,但为什么这是正确的代码?为什么 foo() 返回的临时的“c_str()”指针有效?我想,当输入 bar() 时,这个临时文件已经被破坏了——但它似乎不是这样的。所以,现在我假设 foo() 返回的临时值将在调用 bar() 后被销毁 - 这是正确的吗?为什么?

0 投票
2 回答
2728 浏览

c++ - 完整表达边界和临时对象的生命周期

可能重复:
C++:临时参数的寿命?

据说临时变量在评估完整表达式的最后一步被销毁,例如

临时指针一直存在到 bar 返回,但是对于

它是否仍然存在,直到 bar 返回,或者 baz return 意味着这里的完整表达式结束,我在 baz 返回后检查了 destruct objects 的编译器,但我可以依赖它吗?

0 投票
0 回答
542 浏览

c++ - C++ 17 全表达式标准定义

C++ 17 标准草案中的这一段指出:

一个完整的表达式是:

- 未计算的操作数,

-一个常量表达式([expr.const]),

-一个init-declarator ([dcl.decl]) 或一个 mem-initializer ([class.base.init]),包括初始化器的组成表达式,

- 在对象的生命周期结束时生成的析构函数的调用,而不是临时对象,或者

- 不是另一个表达式的子表达式并且不是完整表达式的一部分的表达式

如果语言构造被定义为产生函数的隐式调用,则语言构造的使用被认为是用于此定义的表达式。[...]

在这篇文章的其余部分,我将把“定义为产生函数的隐式调用的语言构造”简称为“构造”。

我对引用的段落有几个问题:

  1. 为什么提到这段(“并且那不是完整表达式的一部分”)?我能想到的唯一原因是:一个“构造”包含一个表达式(真正的表达式,而不是本段中使用的定义,它将“构造”视为表达式),否则将被视为完整表达式或“construct”包含另一个“construct”,同样,它本身将被视为完整表达式。这些理由正确吗?如果是这样,我将不胜感激一些具体的例子。

  2. “构造”的一些例子是什么?我知道一个对象的初始化可能是一个(因为对构造函数的隐式调用),但是段落的第三个点(“一个 init-declarator ([dcl.decl]))明确地认为它是一个完整的-此外,使用new运算符意味着隐式调用两个函数(一个用于分配空间,然后是构造函数),但new 表达式本身就是一个表达式。

  3. 为什么构造:“S s1(1)”是说完整表达式是对构造函数“S::S(int)”的调用?为什么完整表达式不是构造本身?

0 投票
1 回答
127 浏览

c++ - “充分表达”与“充分表达”

我在 GitHub 上查看这篇文章,但我无法理解 OP 的含义:

"full expression" suggest that it is a kind of expression, but sometimes it is not.

我的解释是“完整表达式”(标准中使用的术语)可能不是表达式。[intro.execution]/5 给出了完整表达式的定义,如下:

完整表达式是(5.1) - 未计算的
操作数 (8.2),
(5.2) - 常量表达式 (8.6),
(5.3) - init-declarator (Clause 11) 或 mem-initializer (15.6.2) ,包括初始值设定项的组成表达式,
(5.4) — 在对象的生命周期结束时生成的析构函数的调用,而不是临时对象 (15.2),或
(5.5) — 不是子表达式的表达式另一个表达式,它不是完整表达式的一部分。

如果我的解释是正确的,我想知道上面的哪个项目符号产生了一个不是表达式的完整表达式。否则,即,如果我错了,他的评论是什么意思?

0 投票
1 回答
64 浏览

c++ - [basic.execution] p5 句子 2 的意图

[basic.execution] p5 第 2 句指出:

如果语言构造被定义为产生函数的隐式调用,则语言构造的使用被认为是用于此定义目的的表达式。

但是,这句话的意图并不清楚。我最好的猜测是,它在这里是为了确保正确的排序并确保在任何隐式函数调用完成之前不会破坏临时对象,但是,我看不到这将适用并改变某些代码的含义的情况。例如:

在这里,return语句将被视为表达式,操作数{}也将被视为表达式,因此是return语句的子表达式。这是句子的意图吗?这还适用于哪些地方并产生有意义的影响?

0 投票
5 回答
172 浏览

c++ - 临时对象的取消引用运算符

在这样的代码中

是否保证A只有在执行后才会删除对象f()

0 投票
0 回答
295 浏览

c++ - 如何理解标准中提到的“full-expression must be a constant expression”这句话

以前,标准中的一些规则说它们适用于表达式,我很困惑这些规则是否也可以任意适用于全表达式。我得到了那个问题的答案。但是,标准中有“初始化的完整表达式必须是常量表达式”这样的规则。如:
dcl.constexpr#9
basic.start.static#2

他们都说完整表达式必须是上面这些链接中的常量表达式。
常量表达式的先决条件是它必须是一个核心常量表达式,它首先是一个表达式。我们知道expr.const#2中的这些规则适用于表达式,而不是不是表达式的完整表达式。

表达式 e是核心常量表达式,除非按照抽象机的规则对 e的求值将求值以下表达式之一:

然而init-declarator,形式declarator initializer(opt)不是表达。那么如何解释一个完整的初始化表达式是一个常量表达式呢?或者,标准中的句子意味着完整表达式中的这些表达式都必须是常量表达式?