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().我需要它来制造错误或至少警告.
简短的回答是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呈现受限制的接口,该接口仅公开OProcess在Process1被调用之后允许的那些操作.
检查的运行时部分是:
void func(std::unique_ptr<OProcess> op) {
process1(std::move(op));
process2(std::move(op));
}
Run Code Online (Sandbox Code Playgroud)
将编译,即使它是未定义的行为,以执行除了op从它移动后的销毁/赋值之外的任何事情.
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |