我正在寻找一个好的ocaml解析库,它不是flex/bison的衍生物.理想情况下,我想要一个沿着parsec行的monadic组合库,但我找不到任何东西.
我会使用haskell,但为haskell制作llvm绑定比我原先想象的更加烦人.
干杯,
杜安
可能重复:
为什么不允许复制构造函数和赋值运算符?
我正在从一个坚实的C背景学习C++,并且急于避免我从reddit和黑客新闻中收集到的以前C++的错误,我一直在使用Google C++样式指南和LLVM的源代码作为我自己的参考码.突出的一点是项目使用以下代码.以下内容取自LLVM的include/Support/MemoryBuffer.h:
MemoryBuffer(const MemoryBuffer &); // DO NOT IMPLEMENT
MemoryBuffer &operator=(const MemoryBuffer &); // DO NOT IMPLEMENT
Run Code Online (Sandbox Code Playgroud)
谷歌回应了这种用法.显然,禁用这些"复制构造函数"是一件好事.
所以我的问题是:为什么这些东西如此可怕,并且(如果它们没有防范)它们的用途是什么样的,它在代码中会产生什么影响?
我试图在C++中创建一个类型不可知的向量,它由两个东西区分.首先,它在对象本身中分配内存,至少在某个点之前,而不是在堆上维护实际的对象数组.其次,它不能使用C++的复制/分配构造函数,这似乎会减慢代码速度并且不是必需的.
在查看我在计算机上维护的代码库时,我在LLVM的代码库中找到了一个类,它非常完美地描述了我正在寻找的内容:SmallVector.h.作为C++的新手,我不完全确定为什么会做出一些设计决策.例如,为什么分配数组U而不是T?评论给出了一个线索:
如果T有一个ctor或dtor,我们不希望它自动运行,所以我们需要将空间表示为其他东西.一个char数组可以很好地工作,但可能没有充分对齐.相反,我们为空间使用了一些联合实例,这保证了最大的对齐.
U当然,指的是以下联盟:
union U {
double D;
long double LD;
long long L;
void *P;
} FirstEl;
Run Code Online (Sandbox Code Playgroud)
所以,我想,这是我真正的问题:为什么要分配一个T暗示构造函数/析构函数被调用的数组?有没有办法在不调用这些构造函数/析构函数的情况下移动c ++对象实例,即进出向量?我想我可以使用LLVM的SmallVector实现,但我讨厌使用代码而不理解它.
最好的,杜安