簡體   English   中英

我可以用 L 值初始化常量 integer 嗎?

[英]Can I initialize a constant integer with a L-value?

我的作業中有一個問題要求我評估以下 function 調用是否正確。 我不確定是否可以使用const int&類型的變量初始化 const int 。 我知道一個 const int 可以用另一個 int 初始化,例如

int i=3; const int j=i 

工作得很好,但我不確定以下代碼在語義上是否正確(行 const int j=bar(++i);)

int foo (int& i) {return i+=2;}

const int& bar(int &i){ return i+=2;}

int main(){
   int i=5;
   const int j=bar(++i);
}

是的,它可以。 您可以使用任何值類別初始化 object。

在構造類型時,它將簡單地使用正確的重載調用其構造函數,例如type(type&& other)type(type const&)

對於平凡的類型,它總是一個副本。 因此,只要類型兼容,無論它們的值類別如何,它都可以工作。

初始化引用是不同的。 您必須有一個具有兼容值類別的表達式。 例如,從 function 創建可變引用將不起作用:

int& j = bar(++i); // won't compile, int& cannot be bound to int const&

這是因為bar返回對 const 的引用,因此不能綁定到對 mutable 的引用。


附帶說明一下,即使它是一個 int 常量,它也不再是編譯時常量。 因此,您將無法將其用作數組大小或模板參數。

要解決這個問題,您必須使用constexpr ,這將保證您的變量的值在編譯時可用。

int a = 9;
constexpr int b = a; // Won't work, `a` is a runtime value, `b` is compile time

constexpr int a = 1;
constexpr int b = a + 1; // Works! Both compile time values

引用基本上只是它綁定到的 object 的別名(可能由const指示不變性)。 由於bar(++i)返回綁定到i的引用,這與您在bar(++i)調用后用i初始化j相同:

bar(++i);
const int j = i;

Const 參考只是說您不能通過該參考修改綁定的 object。 但是您的代碼中沒有任何內容可以嘗試這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM