2016-04-04 85 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; 
};