在C ++ 03中初始化const成员的正确方法

时间:2017-05-02 01:23:12

标签: c++

我需要为遗留环境编写一些 C ++ 03 代码。以下代码编译但编译器(g++ (SUSE Linux) 6.3.1 20170202 [gcc-6-branch revision 245119] 抱怨。

代码:

typedef unsigned char Key[100];

class A {
public:
    const Key key1 {0x1};
    const Key key2;

    A(): key2({0x1}) {};
};

int main() {
    A a;
    return 0;
}

编译器输出:

test.cpp:6:24: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
     const Key key1 {0x1};
                        ^
test.cpp:6:20: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     const Key key1 {0x1};
                    ^
test.cpp:6:24: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     const Key key1 {0x1};
                        ^
test.cpp: In constructor ‘A::A()’:
test.cpp:10:15: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     A(): key2({0x1}) {};
               ^
test.cpp:10:20: warning: list-initializer for non-class type must not be parenthesized
     A(): key2({0x1}) {};

那么初始化const数组成员的正确方法是什么(即符合C ++ 03)?

1 个答案:

答案 0 :(得分:1)

C ++ 11引入了在初始化列表中初始化数组成员的功能。将数组元素初始化为零以外的特定值需要此功能。由于无法复制数组,因此提供要复制的初始化数组也无法正常工作。

然而, 的工作方式是使用struct包装数组,并通过复制const来初始化struct成员。例如:

template <int Size>
struct array {
    unsigned char value[Size];
};
typedef array<100> Key;
class A {
    Key const key1;
    Key const key2;
    static Key make_key() {
        Key rc = Key();
        rc.value[0] = 0x1;
        // whatever else
        return rc;
    }
public:
    A(): key1(make_key()), key2(make_key()) {}
};

make_key()中的初始化仅类似于示例中的初始化(第一个元素初始化为0x1,其他所有其他元素为零)。显然,它可以做任何其他需要的事情,可能是基于从构造函数转发的参数。