结构内联初始化向量。大括号初始化列表

时间:2018-11-05 20:40:48

标签: c++ stl

我遇到了一个奇怪的问题,不幸的是,我无法在应用程序本身之外进行复制。情况如下。我有以下结构。

struct Foo {
    std::string first;
    std::string second;
    bool flag;
    float value;
};

我的一个班级有一个成员std::vector<Foo> fooList,该成员定期进行以下一组操作。

void someOperation() {
    UpdateFooList(); //< Updates existing members of fooList
    UseFooList(); //< Do some useful stuff with the new values.
    fooList.clear();

    // Repopulate fooList which is where the problem is. The call below
    // has never worked here. It results in either junk values 
    // in fooList[0] or some of the member values at [0] before the clear() call
    // appear to be retained after the emplace_back
    fooList.emplace_back(Foo{"First", "Second", true, 0.0f}); 
}

这是我尝试过的东西。

  • 为确保没有数据损坏,请尝试在可以访问fooList的任何地方插入互斥锁。
  • 尝试为Foo创建一个带有签名Foo(const std::string&, const std::string&, bool, float)的4值ctor,并使用此ctor代替了brace-init-list。这里没有运气。
  • 在上面的代码中尝试将emplace_back替换为push_back。这也没有帮助。
  • 试图将这些问题复制到一个隔离的cpp文件中,并且其工作原理完全符合预期。

在应用程序中似乎唯一起作用的是如果我用以下两行替换了emplace_back

auto fooEntry = Foo{"First", "Second", true, 0.0f};
fooList.push_back(fooEntry); //< This works as expected.
fooList.emplace_back(fooEntry); //< This also works as expected

fooList.emplace_back(Foo{"First", "Second", true, 0.0f});的内联调用为何无效的任何想法吗?

我在gcc-7.2.0上,并且该应用程序是根据c++14标准进行编译的。

虽然此信息位可能无关紧要,但为了完整性起见,请在此处添加。所考虑的类使用c++14进行编译并通过.so文件公开,而应用程序本身使用c++17进行编译并加载.so。所考虑的班级成员不会暴露在班级外部。只是类方法是公共的。

0 个答案:

没有答案