LLVMContext作为类成员打破构造函数?

时间:2017-09-03 11:00:02

标签: c++ clang llvm

我正在尝试在类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个”)?

1 个答案:

答案 0 :(得分:4)

llvm::LLVMContext不是可复制的类。它的复制内容已从documentation

中删除
LLVMContext (LLVMContext &) = delete

由于您复制初始化,编译器必须检查您的班级是否有可行的复制文件。但是由于llvm::LLVMContext而被隐式删除。

除非您使用的是C ++ 17,其中copy-elision得到保证且编译器可以避免检查,否则只需删除auto类型声明:

Application application {12, Foo(), 21};