【问题标题】:successively calling temporary object's methods [duplicate]连续调用临时对象的方法[重复]
【发布时间】:2014-06-26 18:27:25
【问题描述】:

是否符合以下代码标准:

struct Temp
{
    Temp& op1() { ...; return *this; }
    Temp& op2() { ...; return *this; }
    // more op...
};

Temp().op1().op2()....;   // safe or not? Which paragraph from ISO 12.2 qualifies it?

【问题讨论】:

  • 我认为它是安全的。临时对象的生命周期直到分号

标签: c++


【解决方案1】:

原码:

struct Temp
{
    Temp& op1() { ...; return *this; }
    Temp& op2() { ...; return *this; }
    // more op...
}

由于缺少最后的分号,此代码不符合标准,无法编译。

它说明了发布真实代码的重要性。


也就是说,是的,成员函数,甚至非const 成员函数,都可以在临时类类型对象上调用,其中包括赋值运算符。

是的,临时的生命周期会延长到完整表达式的末尾(除非通过绑定到引用来延长)。

【讨论】:

  • 函数体内的省略号也不会编译。
【解决方案2】:

完全安全。

在第 3 段(第 12.2 节,[class.temporary]):

临时对象在评估完整表达式 (1.9) 的最后一步时被销毁,该完整表达式 (从词法上) 包含它们的创建点。

§1.9/10 ([intro.execution]) 定义完整表达式:

完整表达式是不是另一个表达式的子表达式的表达式。

并包含一个与您的问题有些相似的示例:

void f() {
  if (S(3).v()) // full-expression includes lvalue-to-rvalue and
                // int to bool conversions, performed before
                // temporary is deleted at end of full-expression
  { }
}

引号和段落编号来自 N3691,即 2013 年中的 c++ 草案,但它们在几年内没有改变,它们可能会在 C++1x 甚至在 C+ 中继续有效+1y (x≅4; y≅7)

【讨论】:

  • 大概标准参考是指C++11吧?请注意,当某些谷歌用户偶然发现此答案时,当前的标准可能会发生变化。
  • 是的,C++11。这里有点晚了,但我会在替换当前标准之前或明天修复它,以先到者为准。
  • 2014 年,也就是明年。希望。
  • @Cheersandhth.-Alf:除了标准领域,2014 年是今年 :) 不过,到 2015 年我们可能会看到 C++14。我不记得看到任何将重新编号引用段落的提案,但我还没有深入研究它。无论如何,编辑了答案;如果您对如何根据未来可能发生的变化引用标准有更具体的建议,我会全力以赴。
  • +1 表示正确行事的意愿。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2011-11-06
  • 2014-03-09
相关资源
最近更新 更多