c++ - 在这种情况下如何测试左值或右值

标签 c++ lvalue rvalue

代码如下:

struct A
{
   static int k;
   int i;
};
 
int A::k = 10;
 
A func() { A a; return a; }

我的问题是,如何判断 func().kfunc().i 是否为左值?如果两者都是左值/右值,我该如何测试它们?

func().k = 0; // compile ok under g++-4.4 and g++-4.6
func().i = 1; // compile ok with g++-4.4, but g++-4.4 gives an error: 
              //"using temporary as lvalue [-fpermissive]"

最佳答案

func().k 是一个左值,而 func().i 是一个 xvalue。

您可以查看更多详细信息: rvalues and temporary objects in the FCD

自始至终,不难判断它们是左值还是右值:

#include <iostream>

struct A
{
    static int k;
    int i;
};

int A::k = 10;

A func( ){ A a; return a; }

void f (int & ) { std::cout << "int& " << std::endl; }

int main ()
{
    func().k = 0;  //ok, because func().k is an r
    f(func().k);
    func().i = 1; //compile error: "using temporary as lvalue"
    f(func().i);  //compile error because func().i is an rvalue of type ‘int’
    return 0;
}

关于c++ - 在这种情况下如何测试左值或右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346068/

相关文章:

c++ - C++ E0137表达式必须为可修改的左值

c++ - 混淆右值和左值

c++ - C++ 中的日期/时间解析(任何格式字符串到 Epoch)

c++ - 如何在 QwtPlot 上给 QwtPlotCurve 添加标签?

c++ - boost::PO 不能绑定(bind)到 ‘std::basic_ostream<char>&&’

c++ - 为什么我无法构建此正则表达式

c - 错误 : expression must be a modifiable lvalue (tal * tal)

c++ - 具有新放置的右值引用(与 std::vector.push_back 类似的功能)

c++ - C++ 中的右值绑定(bind)混淆

C++为什么我不能在具有已删除默认构造函数的对象上使用交换