2016-01-21 54 views
0

我試圖執行兩種不同的情況:爲什麼常變量不被視爲編譯時間常數有時

方案1:

const auto arraySize = 10; // fine, arraySize is constant 
std::array<int, arraySize> data; 

這裏,ARRAYSIZE被視爲編譯時間常數,因此它被允許在std :: array中。

方案2:

int sz=10; 
const auto arraySize = sz; // fine . 
std::array<int, arraySize> data; //error , arraySize is not compile time constant . 

在方案2中,ARRAYSIZE不被視爲編譯時儘管事實上,arrySize是SZ的恆定不變的副本。

爲什麼這兩種方案進行了區別對待?

+2

'arraySize'是一個* not *常量的常量副本...? – DevSolar

+2

因爲'const'並不意味着「編譯時間常數」。在某些情況下,它可以是編譯時,但不能保證,因此你不能在需要編譯時常量的上下文中使用它們。改用'constexpr'! –

回答

0

你或許應該考慮使用constexpr

int sz=10;是一個變量設置爲一些常數。編譯器可能是足夠聰明的(或不!)不斷的優化,當它傳播。

3

因爲可以像

int sz = 0; 
std::cin >> sz; 
const auto arraySize = sz; 

和這裏的sz值在運行時間定義的。您可以使用constexpr,而不是const,比將這種初始化編譯錯誤。

相關問題