我正在尝试在类LLVMContext
中创建一个Application
成员变量。 MCVE:
#include <llvm/IR/LLVMContext.h>
struct Foo {};
class Application {
public:
Application(int a, Foo foo, int b);
private:
llvm::LLVMContext context_;
};
void function() {
auto application = Application(12, Foo(), 21);
}
然而,添加变量会产生一些非常奇怪的错误:( Clang 4.0.1和Apple LLVM版本8.1.0)
toy.cpp:13:8: error: no matching constructor for initialization of 'Application' auto application = Application(12, Foo(), 21); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ toy.cpp:5:7: note: candidate constructor (the implicit copy constructor) not viable: expects an l-value for 1st argument class Application { ^ toy.cpp:7:3: note: candidate constructor not viable: requires 3 arguments, but 1 was provided Application(int a, Foo foo, int b); ^ 1 error generated.
这里发生了什么?为什么Clang认为我正在尝试使用带有一个参数的构造函数(“但是提供了1个”)?
答案 0 :(得分:4)
llvm::LLVMContext
不是可复制的类。它的复制内容已从documentation:
LLVMContext (LLVMContext &) = delete
由于您复制初始化,编译器必须检查您的班级是否有可行的复制文件。但是由于llvm::LLVMContext
而被隐式删除。
除非您使用的是C ++ 17,其中copy-elision得到保证且编译器可以避免检查,否则只需删除auto
类型声明:
Application application {12, Foo(), 21};