0

我需要静态 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

4

0 回答 0