C++ std::临时对象上的转换

C++ std::临时对象上的转换,c++,lambda,C++,Lambda,我有一个函数返回一个对象向量,我想创建一个从这些对象中提取的成员向量。我使用std::transform来实现这一点。然而,代码是分段的。GDB不是很有帮助。有人能解释一下发生了什么事吗 #include <algorithm> #include <iostream> using namespace std; class Container { private: string _id; public: Container(const s

我有一个函数返回一个对象向量,我想创建一个从这些对象中提取的成员向量。我使用std::transform来实现这一点。然而,代码是分段的。GDB不是很有帮助。有人能解释一下发生了什么事吗

#include <algorithm>
#include <iostream>
using namespace std;

class Container
{
    private:
    string _id;

    public:
    Container(const string &str): _id(str) {}

    const decltype(_id) &id() const {
        return this->_id;
    }

};

Container a{"hello"}, b{"world"};

vector<Container *> fn()
{
    return {&a,&b};
}

int main() {
    vector<string> ids;
    const auto &elements = fn();
    std::transform(elements.begin(), elements.end(), ids.begin(), [](const Container *container){ return container->id();});

}
#包括
#包括
使用名称空间std;
类容器
{
私人:
字符串_id;
公众:
容器(常量字符串和str):\u id(str){}
常量decltype(_id)&id()常量{
返回此->\u id;
}
};
容器a{“你好”},容器b{“世界”};
向量fn()
{
返回{&a,&b};
}
int main(){
向量ID;
常量auto&elements=fn();
std::transform(elements.begin()、elements.end()、ids.begin()、[](const Container*Container){return Container->id();});
}
ids.begin()
不是有效长度范围
元素的迭代器。size()
,因为
ids
为空且
元素的大小为2

您可能需要
std::back\u插入器(ids)

std::vector<std::string> ids;

std::transform(elements.begin(), elements.end(),
               std::back_inserter(ids),
               [](const Container *container){ return container->id();});

assert(ids.size() == elements.size());
std::向量id;
std::transform(elements.begin()、elements.end(),
标准:背面插入器(ids),
[](const Container*Container){return Container->id();});
断言(ids.size()==elements.size());
矢量ID
是一个空向量,您正试图使用普通迭代器向其添加元素。这将导致segfault,因为您将访问不属于自己的内存。您需要的是一个将元素推回向量的方法

std::transform(elements.begin(), elements.end(), std::back_inserter(ids),
               [](const Container *container){ return container->id();});

元素
指向一个过期的、实际上没有问题的临时元素。通过常量引用延长临时文件的使用寿命。我应该使用ID的反向插入器。在查看时,我试图找到一个提示,表明输出迭代器必须指向足够大小的有效范围的开头,但我找不到它。还有
back\u inserter
示例,但对输出迭代器没有明确的要求。这对其他人来说是显而易见的,还是只是文档中缺少信息?好吧,效果被描述为“将结果存储在另一个范围中,从d_开始”(实际值类似),因此您可以由此推断分配的目的地必须存在。我认为在某些地方,笼统的措辞涵盖了这一点,即论点必须对其预期用途有效。