2016-04-04 82 views
0

我有這樣的標題:成員爲const且列表初始化的非靜態成員使用無效?

class A{ 
    const int x; 
    typedef std::array<MyClass, x> ARRAY; // Cannot use x here? 

}; 

,並在實現文件:

A::A() : x(10) {} 

,但我得到了的typedef行編譯器錯誤說:

無效使用的非靜態數據成員A :: x

我是你ght x只能用於數組大小的常量?我真的希望避免靜電。

+2

*「我以爲只有在數組大小調整x時才需要const」*。你的想法是錯誤的:'const'不夠,它必須是* const **表達式***,這意味着它的*值*必須被編譯器知道。在你的情況下,'x'是**不是** const *表達式*;它只是一個只讀表達式(這意味着,它的值不被編譯器知道,但如果你試圖改變它的值,編譯器會咬你)。 – Nawaz

+0

@Nawaz [在評論中沒有回答](http://meta.stackoverflow.com/q/320364/2069064) – Barry

+0

這是你的第二個問題,你聲稱你真的想避免靜態。我真的很想看到你問你的這個特殊問題。因爲一旦解決了問題,你實際上可以編寫更好的代碼。 – StoryTeller

回答

3

爲了使用x作爲非類型模板參數,它必須是核心常量表達式 - 基本上它必須在編譯時可評估。一個簡單的const是不夠的標準,const只是意味着它將來不可修改 - 這並不意味着它在編譯時已知數量。

這裏有一個邊緣的情況下,其可以在一個const積分的情況下這樣的核心常量表達式會造成一些混亂:

const int x = 10; 
std::array<int, x> arr; // ok 

沒有什麼理由要避免static。你會想要做這樣的事情:

struct A { 
    static constexpr int x = 10; 
    typedef std::array<MyClass, x> ARRAY; 
};