我已按以下方式宣布课程
class A
{
struct B
{
constexpr
B(uint8_t _a, uint8_t _b) :
a(_a),
b(_b)
{}
bool operator==(const B& rhs) const
{
if((a == rhs.a)&&
(b == rhs.b))
{
return true;
}
return false;
}
uint8_t a;
uint8_t b;
};
constexpr static B b {B(0x00, 0x00)};
};
但是g ++说
错误:字段初始化程序不是常量
无法弄清楚我错在哪里。
答案 0 :(得分:9)
Clang更有帮助:
27 : error: constexpr variable 'b' must be initialized by a constant expression
constexpr static B b {B(0x00, 0x00)};
^~~~~~~~~~~~~~~~
27 : note: undefined constructor 'B' cannot be used in a constant expression
constexpr static B b {B(0x00, 0x00)};
^
8 : note: declared here
B(uint8_t _a, uint8_t _b) :
^
在成员变量的 brace-or-equal-initializer 中,构造函数(包括嵌套类的构造函数)被认为是未定义的;这是因为构造函数引用成员变量的值是合法的,因此必须首先定义成员变量,即使它们在文件中稍后有词法:
struct A {
struct B { int i; constexpr B(): i{j} {} };
constexpr static int j = 99;
};
解决方法是将B
放在A
之外,或者放在基类中。
答案 1 :(得分:2)
#include <cstdint>
#include <iostream>
class A
{
struct B
{
bool operator==(const B& rhs) const
{
if((a == rhs.a)&&
(b == rhs.b))
{
return true;
}
return false;
}
uint8_t a;
uint8_t b;
};
public:
constexpr static B b {0x61, 0x62};
};
int main() {
std::cout << '{' << A::b.a << ',' << A::b.b << '}' << std::endl;
}
从struct
中删除构造函数将允许大括号初始化程序工作。如果你打算在构造函数中做一些时髦的事情,这对你真的没有帮助。