过去几年我一直在用C++编码。但有一个问题我一直无法弄清楚。我想问一下,c++中的所有临时值都是右值吗?

如果没有,任何人都可以为我提供一个代码中临时生成的示例吗 左值,左值?

有帮助吗?

解决方案

不。

C ++语言规范从未像您要问的那样简单明了。它在语言标准中并没有说“所有临时对象都是rvalues”。此外,问题本身有点误称,因为在C ++语言中成为RVALUE的属性不是对象的属性,而是表达式的属性(即其结果的属性)。实际上,这就是语言规范中定义的方式:对于结果是lvalue及其为rvalue时,它说的不同类型的表达式。除其他外,这实际上意味着可以作为rvalue和lvalue访问临时对象,这取决于用于执行访问的表达式的特定形式。

例如,字面的结果 2 + 3 表达显然是rvalue,一种临时类型 int. 。我们不能应用一般的 & 自从Unary以来 & 需要lvalue作为操作数

&(2 + 3); // ERROR, lvalue required

但是,众所周知,可以像临时对象一样持续参考,例如

const int &ri = 2 + 3;

在这种情况下,引用附加到临时性,从而延长了后者的寿命。显然,一旦完成,我们就可以访问与lvalue的暂时性 ri, ,因为参考总是是lvalues。例如,我们可以轻松,合法地应用一元 & 参考并获取指向临时性的指针

const int *pi = &ri;

只要暂时存在,该指针就保持完全有效。

LVALUE访问临时对象的另一个明显示例是我们通过其访问类型的临时对象 this 指针。的结果 *this 是一个LVALUE(一元的结果始终如一 * 应用于数据指针),但并不会改变实际对象很容易成为暂时性的事实。对于给定的班级类型 T, , 表达 T() 正如语言标准中明确说明的那样,是一个rvalue,但通过 *T().get_this() 表达式(明显的实施 T::get_this())是一个lvalue。与上一个示例不同,此方法允许您立即获得非符合条件的LVALUE,该LVALUE指的是临时对象。

因此,再次,同样的临时对象可能很容易被“看作”为rvalue或lvalue,具体取决于什么样的表达(哪种表达方式) 访问路径)您用来“查看”该对象。

其他提示

Prasoon Saurav已经链接了一个非常好的CLC ++线程。在那里,詹姆斯·坎兹(James Kanze)解释了为什么这个问题真正没有意义。归结为:

  • rvalue -ness是表达式的(布尔)属性 - 每个表达式都是lvalue或rvalue
  • 暂时是 不是 表达

因此,这个问题没有意义。

一个很好的例子是以下代码:

int main() {
  const int& ri = 4;
  std::cout << ri << std::endl; 
}

具有价值的临时int 4 不是表达。表达方式 ri 这不是暂时的。这是一个lvalue,是指临时性。

好吧,该数组操作员返回参考,任何返回引用的函数都可以被认为可以做同样的事情吗?所有参考都是const,虽然它们可以是lvalues,但它们会修改其引用的内容,而不是参考本身。对于 *操作员,

*(a temp pointer) = val;

我发誓我曾经使用一些会将临时值传递给任何参考函数的编译器,

所以你可以去:

int Afunc()
{
   return 5;
}

int anotherFunc(int & b)
{
    b = 34;
}


anotherFunc(Afunc());

找不到现在可以做到这一点的人,必须是const,以便允许通过临时值。

int anotherFunc(const int & b);

无论如何,参考可以是lvalues and暂时的,诀窍是它的引用未经修改,只有它的引用。

如果您计算-> 作为操作员的操作员,然后临时指针可以是LVALUE,但是适用相同的条件,它不是会更改的临时指针,而是它指出的东西。

阵列索引操作既是临时的,也是lvalue,类似[10] = 1的东西就是您要寻找的示例。 LVALUE是一个临时计算的指针。

简短回答:是的,但我不打算引用标准,因为证明这一点需要解决所有的临时问题。根据定义,临时有一个语句的生命周期,所以将事物分配给一个语句充其量是糟糕的风格。

有趣的答案:复制elision可以使(通常使)一个临时对象与左值对象相同。例如,

MyClass blah = MyClass( 3 ); // temporary likely to be optimized out

return MyClass( 3 ); // likely to directly initialize object in caller's frame

编辑: 至于在这些情况下是否存在任何临时对象的问题,§12.8/15提到

复制操作可以通过将临时对象直接构造到省略副本的目标中来省略

这将表明有一个临时对象可能与左值相同。

SharePoint Designer提供了通过工作流设计器用户界面(UI)可用的工作流操作集合。虽然SharePoint Designer中包含的工作流程操作范围很广泛,但它是有限的。在某些情况下,您可能需要模拟SharePoint Designer中可用的现有工作流操作库未满足其要求的业务流程。

您可以看看以下链接,

创建自定义的最佳实践SharePoint 2010的活动

有用的SharePoint Designer自定义工作流程活动。 - >在此处,您可以使用“发送包含HTTP文件附件活动的电子邮件“ - >此活动允许使用Web请求发送带有附件的电子邮件。执行Reporting Services报告并将其发送为从SPD工作流程中的附件将是一个这样的示例。请求URL完全可自定义,可以包括工作流量变量。支持HTTP和HTTPS请求。 。

SharePoint 2010:使用Visual Studio 2010创建工作流程活动

SharePoint 2010的自定义SharePoint Designer活动。

如何创建自定义操作对于工作流程?

如果没有,谁能为我提供一个示例,其中代码中生产的临时性是lvalue?

以下代码将常数引用绑定到类型的临时对象 const float 由编译器创建:

int i;
const float &cfr = i;

行为是仿佛":

int i;
const float __tmp_cfr = i; // introduced by the compiler
const float &cfr = __tmp_cfr;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top