2011-03-01 23 views
8

int i = 5;rvalues总是不变?

int j = i; 

将右值i在该表达式评估结果,当是一个常数?

我问这个问题,因为在我的拷贝构造函数它的参数需要const

+3

“要求'const'”:如果它接受一个'const的A&',你也可以通过它的一些'A&'因为从非const到const的转换隐式发生。 – 2011-03-01 13:14:19

+0

你应该添加“你的拷贝构造函数”的代码,并解释“你需要一个'const'”的含义。这将有助于回答您的实际疑问,而不是回答可能存在误导的问题。 – 2011-03-01 14:16:17

回答

14

围绕左值/右值条款存在一个常见的误解。他们不是指变量,而是指表达式。一个表达式可以产生一个左值或右值,并且可以是常量或非常量。

特别是,在您的代码中,定义int j = i;右侧的表达式i是一个左值表达式,而不是右值。为了赋值,有一个左值右值转换,然后将其赋值给新声明的变量。

连续性是一个正交的概念 - 在大多数情况下 - 与您是否可以或不可以改变正在处理的对象有关。

int f(); 
int& g(); 
const int& h(); 
const int k(); 

int main() { 
    f();   // non-const rvalue expression 
    g();   // non-const lvalue expression 
    h();   // const lvalue expression 
    k();   // const rvalue expression 
    f() = 5;  // error, cannot assign to an rvalue 
    g() = 5;  // correct, can modify a non-const lvalue 
    h() = 5;  // error, cannot modify a constant lvalue 
} 

其他例子需要使用用户定义类型:

struct test { 
    void foo() { x = 5; } 
    void bar() const; 
    int x; 
}; 
test f(); 
const test g(); 
int main() { 
    f().foo();  // f() is a non-const rvalue, 
        // but you can call a method on the resulting object 
    g().foo();  // g() is a const rvalue, 
        // you cannot call a mutating member function 
    g().bar();  // but you can call a const member function 
} 
+0

嗨,为什么我不能编译第一个例子?谢谢。我试着评论错误陈述,但仍然没有编译。 – user12321 2011-03-03 00:55:45

+0

@ user12321:你可能可以编译而不是*链接*,因为函数没有被定义(错误是类似* undefined symbol ... *?的错误)。添加一个像'{static int x = 10; return x; }'给每个函数,注释那些被标记为错误的行,然后重试。 ('static'仅用于确保从返回引用的版本返回后该变量仍然存在) – 2011-03-03 08:36:56

3

在C++中,右值的内置类型不能是const或者非const。这只是没有意义。但是,类类型可以是const和非const类型的。

右值只是VALUE(而不是对象/变量)。你对“非常量值”有什么了解?

+1

@Downvoter:我想知道我的回答中有什么错误? – 2011-03-01 13:17:28

+0

@Armen:我不是@downvoter,但是......你说“在C++中,内建类型的rvalues不能是const或非const。”右值**必须是常量或非常量。在OP示例中,我是右值并且是**非常量**。如果我被声明为'const int i = 5;'那么当用作右值时,右值是** const **。 – qbert220 2011-03-01 13:34:41

+2

@qbert:错误:) C++标准3.10.9状态类的右值可以具有cv限定的类型;非类rvalues总是有cv不合格的类型。 Rvalues应始终具有完整的类型或void类型;除了这些类型之外,左值还可以具有不完整的 类型。 – 2011-03-01 13:42:32