我需要为遗留环境编写一些 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)?
答案 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
,其他所有其他元素为零)。显然,它可以做任何其他需要的事情,可能是基于从构造函数转发的参数。