一个类中的static const double / float,ok还是不行,请给我一个当前的答案

时间:2014-07-12 02:11:04

标签: c++ c++11

上次我对static const int,const int和static int的初始化感到困惑,那么有些人会帮助我。但问题再次出现,

我尝试这些int C_free 5.0

class Q{

   static const double qs = 10;//float is also ok

};

然后我在Qt creator 2.8.1中尝试,这不能通过。

因此,要完全理解这一点,任何人都可以给我一个完整的解释,在哪种情况下允许哪种类型?不只是int类型。感谢。

原谅我,新的C ++学习者,不是好英语

2 个答案:

答案 0 :(得分:3)

using T = sometype;
class Q
{
    static const T qs = somevalue;
};

... T必须是整数类型或枚举类型:

C ++11§9.4.2/ 3

  

<强>”
  如果非易失性const static数据成员是整数或枚举类型,则其在类中声明   definition可以指定 brace-or-equal-initializer ,其中 assignment-expression 的每个 initializer-clause 都是一个常量表达式。< / p>

这里常量表达式的含义本质上是它可以在编译时进行评估;它由C ++11§5.19/ 3定义。


C ++ 11 constexpr允许更广泛的类型,如果所有相关编译器都支持它。


一个简单的替代方法是:

class Q
{
    static
    auto qs() -> double { return somevalue; }
};

还有一个更精细的替代方案,模板化的const技巧:

template< class Dummy_ >
struct Q_constants_
{
    static double const qs;
};

template< class Dummy_ >
double Q_constants<Dummy_>::qs = somevalue;

class Q
    : public Q_constants_<void>
{};

答案 1 :(得分:0)

这就是标准草案对const static成员数据的初始化所说的内容:

  

9.4.2 / 3如果非易失性const static数据成员是整数或枚举类型,则其在类定义中的声明可以指定大括号或等于初始值其中作为赋值表达式的每个 initializer-clause 都是一个常量表达式(5.19)。可以使用static说明符在类定义中声明文字类型的constexpr数据成员;如果是这样,它的声明应指定一个大括号或等于初始化,其中作为赋值表达式的每个 initializer-clause 都是一个常量表达式。

您可以选择将qs的类型更改为整数类型,也可以将其更改为constexpr而不是const

使用:

class Q
{
   static const int qs = 10;
};

class Q 
{
   static constexpr double qs = 10;
};