struct Parameters {
static constexpr int n = 2;
static constexpr double v[n] = {4.0, 5.0};
};
int main() {
constexpr int a = Parameters::v[0];
return 0;
}
此代碼對GCC 4.8.2編譯成以下幾點:
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: c7 45 fc 04 00 00 00 mov DWORD PTR [rbp-0x4],0x4
b: b8 00 00 00 00 mov eax,0x0
10: 5d pop rbp
11: c3 ret
所以,是的,它是一個編譯時間常數。
鐺3.4產生類似的代碼:
0000000000000000 <main>:
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: b8 00 00 00 00 mov eax,0x0
9: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
10: c7 45 f8 04 00 00 00 mov DWORD PTR [rbp-0x8],0x4
17: 5d pop rbp
18: c3 ret
再次,這是一個編譯時間常數。
一切都是用-O0編譯的。
P.S:如果是聲明爲const,那麼GCC沒什麼變化,但對於鐺做,值4不直接彷彿是一個編譯時間常數mov'ed。
如果聲明既不是const或constexpr然後兩種編譯器無法處理參數:: v [0]作爲一個編譯時間常數。
請注意'v'不是一個指針,它是一個數組。 – Angew
似乎是完全合法的:http://ideone.com/oMwXAj –
當x是const int \ [\]時,C++ 11中可能有[\'x \ [0 \] == 1 \ ?](http://stackoverflow.com/questions/18903113/x0-1-constant-expression-in-c11-when-x-is-const-int) –