我正在尝试使以下代码工作于
auto createMyArray = []() {
float foo[] = {0.0f, 1.5f, 2.0f};
return foo;
};
auto myArray = createMyArray();
std::vector<float> myVector;
// fatal error: no matching function for call to 'begin'
myVector.insert(myVector.end(), std::begin(myArray), std::end(myArray));
问题是createMyArray返回一个指向数组的指针,我不确定尝试取消引用它是否是个好主意
此外,我收到以下警告
warning: address of stack memory associated with local variable 'foo' returned [-Wreturn-stack-address]
return foo;
这是有意义的,因为我不使用new来创建数组,因为我想避免堆分配。
处理此类数组的现代C++方法是使用std::array
。这样可以避免你面临的问题。
像您这样使用本机C数组会使您陷入与分配相关的问题,而这些问题应该避免。您看到的编译器警告不能掉以轻心(就像任何警告一样(。它告诉您foo
指向的内存超出了lambda的范围。它很可能被您在调用createMyArray()
之后创建的myVector
对象覆盖,对foo
元素的任何进一步引用都可能给您带来垃圾。
除此之外,这里还有一些有用的答案:如何在不循环的情况下将数组的内容复制到C++中的std::vector?
退出lambda表达式后,本地数组将不活动。因此,代码具有未定义的行为。
但是不需要使用lambda在向量中插入初始值设定项列表。
这是一个示范节目。
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<float> myVector;
myVector.insert( std::end( myVector ), {0.0f, 1.5f, 2.0f} );
for ( const auto &item : myVector ) std::cout << item << ' ';
std::cout << 'n';
return 0;
}
程序输出为
0 1.5 2
您可以使用std::back_inserter
将元素复制到末尾附加的向量中
std::copy(myArray, myArray + 3, std::back_inserter(myVector));
或
myVector.insert(myVector.end(), myArray, myArray + 3);
顺便说一句,在lamba函数中创建的数组是堆栈分配的,这意味着在执行lamba函数后,数组将不再存在,而是使用new
或std::array
进行动态内存分配