[英]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.