我需要静态 std::initializer_list 来参数化我的 gtest 模板夹具。因此,对于任何经过测试的类型,我都需要初始化夹具成员,如下所示(最后一行):
template <typename T>
class ExampleTemplatedUnitTest : public ::testing::Test {
protected:
static std::initializer_list<typename T::value_type> initializers;
};
TYPED_TEST_CASE_P(ExampleTemplatedUnitTest);
TYPED_TEST_P(ExampleTemplatedUnitTest, exampleTest) {
for (auto p : ExampleTemplatedUnitTest<TypeParam>::initializers)
printf("p = %d", p);
}
REGISTER_TYPED_TEST_CASE_P(ExampleTemplatedUnitTest, exampleTest);
typedef ::testing::Types<
std::vector<int>
> testedTypes;
INSTANTIATE_TYPED_TEST_CASE_P(value, ExampleTemplatedUnitTest, testedTypes);
std::initializer_list<int> ExampleTemplatedUnitTest<std::vector<int>>::initializers = { 1,2 };
但是它会触发以下警告:
unit_test.cpp(502): warning C4592: 'initializers': symbol will be dynamically initialized (implementation limitation)
我发现了这个问题: 错误 C4592:符号将被动态初始化。VS2015.1 static const std::vector 字段 和许多其他主题,但都涉及更新 1 中的错误。
因此我仍然无法理解我做错了什么?我应该忽略并禁用此警告还是有办法修复它?测试通过并表现得完全符合我的要求。(在实际测试中,我使用这个静态初始化列表来实际使用 std::initializer_list 的构造函数初始化对象,上面的代码只是缩短的示例)
我已经使用这种类型化测试技术的参数化很长时间了,还没有遇到过这种情况,但这是第一次使用 std::initializer_list