2011-03-01 45 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