编译连续函数调用的时间检查

klm*_*123 2 c++ compiler-errors

假设我们有一个这样的类:

class OProcess {
  ...
  void Process1();
  void Process2(); // call only if Process1 wasn't called
  ...
}
Run Code Online (Sandbox Code Playgroud)

这样只有当函数Process1()尚未被调用时才能调用函数Process2().

有没有办法检查Process类在编译时是否正确使用?如果Process1()可以在Process2()之前为某些OProcess对象实例调用,则编译器必须给出错误.

PS我明白可以有这样的代码:

 if (variable == 1000)
   Process1();
 Process2();
Run Code Online (Sandbox Code Playgroud)

并且编译器无法确定在Process2()之前是否会调用Process1().但是编译器可以确保在Process2()之前可以为某些变量值调用Process1().我需要它来制造错误或至少警告.

Mat*_* M. 6

简短的回答是Somewhat.


答案很长:C++没有实现Linear Typing,因此无法在编译时(完全)完成唯一性检查.仍然,阅读这个描述给了我们一个技巧:在编译器中实现这一点,语言设计者禁止别名并强制执行消费.

因此,如果您同意允许某些运行时检查,那么可以通过让进程使用该对象来完成:

class OProcess {
public:
};

std::unique_ptr<OProcessed1> process1(std::unique_ptr<OProcess> op);
std::unique_ptr<OProcess>    process2(std::unique_ptr<OProcess> op);
Run Code Online (Sandbox Code Playgroud)

OProcessed1代理在何处OProcess呈现受限制的接口,该接口仅公开OProcessProcess1被调用之后允许的那些操作.

检查的运行时部分是:

void func(std::unique_ptr<OProcess> op) {
    process1(std::move(op));
    process2(std::move(op));
}
Run Code Online (Sandbox Code Playgroud)

将编译,即使它是未定义的行为,以执行除了op从它移动后的销毁/赋值之外的任何事情.