![](/img/trans.png)
[英]Why address-of operator ('&') can be used with objects that are declared with the register storage class specifier in C++?
[英]Register storage specifier in C++
我很好奇知道C/C++
的register
存儲說明符的行為。 以下程序在C++
有效,但在C
情況下無效。
int main()
{
register int i;
int* b = &i; // Valid in C++ but not in C
}
那么,我的問題我, 為什么C ++允許地址運算符(&)到寄存器變量?
PS:我知道寄存器存儲說明符在現代編譯器中已棄用。
您的答案可以在這里找到:
http://en.cppreference.com/w/cpp/language/storage_duration
在C語言中,不能獲取寄存器變量的地址,但是在C ++語言中,聲明為register的變量與沒有任何存儲類說明符的聲明變量在語義上沒有區別。
在C語言標准化之前,C和C ++有所分歧。 兩者都使用了register
關鍵字,但是只有C添加了對&
運算符的限制。
回顧歷史,C ++ 98標准說,
register
說明符與auto
說明符具有相同的語義,並帶有實現的提示,即聲明的對象將大量使用。 [ 注意:提示可以忽略,在大多數實現中,如果使用對象的地址,則將忽略提示。 — 尾注 ]
隨后不推薦使用,這與通過語義限制進行增強相反。 計划在即將發布的C ++ 17標准中將其刪除。
( auto
后來在C ++ 11中被重新利用。它的舊含義與局部變量的默認存儲相同。)
那么,我的問題我, 為什么C ++允許地址運算符(&)到寄存器變量?
答案是:
因為C和C ++是不同的語言,並且遵循其他答案中指出的不同標准。
區別在於C ++標准(7.1.1存儲類規范)中的引號
3寄存器說明是實現的暗示,即聲明的變量將被大量使用。 [注意:提示可以忽略, 在大多數實現中,如果采用變量的地址,則將忽略提示。 不建議使用此用法(請參閱D.2)。 —尾注]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.