我正在尝试使用unique_ptr来管理我的记忆,而VS2013似乎在给我带来麻烦,我认为它不应该.
似乎编译器无论出于什么原因试图访问已删除的拷贝构造函数,而它真的应该没有理由这样做.
这是我的一个类看起来像:
class Mesh
{
public:
Mesh(oglplus::Program* program, const std::vector<Vertex>& vertices,
const std::vector<GLuint>& indices);
void draw();
private:
const oglplus::Program* _program;
std::vector<Vertex> _vertices;
std::vector<GLuint> _indices;
oglplus::Buffer _faceBuffer;
oglplus::Buffer _vertexBuffer;
oglplus::VertexArray _vao;
};
class Model
{
public:
Model(std::string filename, oglplus::Program* program);
void draw();
private:
const oglplus::Program* _program;
std::vector<std::unique_ptr<Mesh>> _meshes;
};
Run Code Online (Sandbox Code Playgroud)
问题出在线上
std::vector<std::unique_ptr<Mesh>> _meshes;
Run Code Online (Sandbox Code Playgroud)
它开始喷出像这样的东西
2>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(593): error C2280: 'std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
2> with
2> [
2> _Ty=Model::Mesh
2> ]
2> …Run Code Online (Sandbox Code Playgroud) 我看到类似的用法
#include <iostream>
#include <functional>
using namespace std;
template<typename FN>
void Foo(FN&& Fn)
{
Fn();
}
void b()
{
cout << "2." << endl;
}
int main()
{
Foo([](){ cout << "1." << endl; });
Foo(&b);
auto c = []() { cout << "3." << endl; };
Foo(c);
std::function<void(void)> d = c;
Foo(d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我相当确定“c”是一个左值,但我可以相信存在一些 lambda 类型推导恶作剧。但我几乎 100% 确定,d 是左值。
如果函数接受右值,但 d 是左值,为什么模板化的东西可以工作?
此外,为什么人们会这样写 Foo 的签名而不是仅仅这样?
template<typename FN>
void Foo(FN Fn)
Run Code Online (Sandbox Code Playgroud) 我想做类似下面的事情
#include <iostream>
#include <functional>
using namespace std;
bool b1, b2;
int i1, i2;
template<typename COMP>
bool my_comp(COMP comp)
{
return comp<bool>(b1, b2) && comp<int>(i1, i2);
}
int main()
{
my_comp(std::equal_to);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,我想将模板化类传递给模板,并在事后指定模板化类模板参数。
我可以这样做吗?