初始化 GTest const class 成员
Initializing GTest const class members
我想实现这样的目标:
class MyTest: public ::testing::Test {
public:
const int myConstInt = 23;
}
TEST_F(MyTest, MyTest1) {... use myConstInt ...}
但是回忆起 EffectiveCPP 的第 4 项,这种方式不能保证初始化,并且有可能出现未定义的行为。
假设上面是方法1.
我可以想到另外两种方法来实现这一点:
方法 2:使用 MyTest 构造函数的 myConstStr 的初始化列表。
方法 3:将其设置为 constexpr - 因为该值是在编译时设置的,所以我不应该在运行时遇到任何初始化问题。
哪种方法才是正确的处理方法?另外 Effective CPP 是一本相对较旧的书 - 第 4 项的讨论是否仍然完全适用?
Post 关于 Cpplang slack 的讨论,发现最好的解决方案是对任何 integral/Enum 类型使用 static const
- 也可以使用 static constexpr
但是这个本质上是相同的,除了在 C++17 中静态 constexpr 数据成员也可以被内联。
额外有用的参考:
const int myConstInt = 23;
是一个非静态数据成员,带有默认成员初始值设定项
https://en.cppreference.com/w/cpp/language/data_members#Member_initialization
绝对没有未定义行为的风险。
保证初始化
我想实现这样的目标:
class MyTest: public ::testing::Test {
public:
const int myConstInt = 23;
}
TEST_F(MyTest, MyTest1) {... use myConstInt ...}
但是回忆起 EffectiveCPP 的第 4 项,这种方式不能保证初始化,并且有可能出现未定义的行为。
假设上面是方法1.
我可以想到另外两种方法来实现这一点:
方法 2:使用 MyTest 构造函数的 myConstStr 的初始化列表。
方法 3:将其设置为 constexpr - 因为该值是在编译时设置的,所以我不应该在运行时遇到任何初始化问题。
哪种方法才是正确的处理方法?另外 Effective CPP 是一本相对较旧的书 - 第 4 项的讨论是否仍然完全适用?
Post 关于 Cpplang slack 的讨论,发现最好的解决方案是对任何 integral/Enum 类型使用 static const
- 也可以使用 static constexpr
但是这个本质上是相同的,除了在 C++17 中静态 constexpr 数据成员也可以被内联。
额外有用的参考:
const int myConstInt = 23;
是一个非静态数据成员,带有默认成员初始值设定项 https://en.cppreference.com/w/cpp/language/data_members#Member_initialization
绝对没有未定义行为的风险。
保证初始化