如何使用 C++ Expects 运算符?

How to use C++ Expects operator?

我正在开始一个使用 C++ 的项目,我以前没有在少数学校项目之外使用过它 - 远不及我现在正在处理的范围。

我的目标是尽最大努力遵循 C++ Core Guidelines 工作以避免错误、提高性能,最重要的是:提高代码的可维护性。

我已经 运行 遇到了 数百个 的问题,从我的 g++ / Clang++ 版本不正确到找不到标准库,再到 g++ 使用错误用于编译非常基本功能的 C++ 版本未按预期运行 - 我什至还没有开始研究 autotools,所以我预计接下来会有更多令人头疼的问题。

不过,此问题特定于 C++ 核心指南的一部分。 Interfaces 6: Prefer Expects() for expressing preconditions

我试着编写了以下简单代码:

#include <iostream>

using namespace std;

int square(int x) {
    Expects(x > 0);
    return x * x;
}

int main() {
    cout << square(3) << endl;
    return 0;
}

这在 g++ 中引发了一个错误:

$> g++ -std=c++17 main.cpp
main.cpp: In function ‘int square(int)’:
main.cpp:7:2: error: ‘Expects’ was not declared in this scope
  Expects(x > 0);
  ^~~~~~~
-> [1]

我也尝试过使用 Clang,但它有一个完全不同(且不相关)的问题:

$> clang++ -x c++ main.cpp
main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
-> [1]

我还没有想出如何解决这个问题,所以我没有费心。

Expects 是 GSL 库的一部分。您必须使用一些 GSL 库实现,您可以在 Github:

上找到它

这些是我脑子里想出来的。

CPP 指南可能暗示 the "contracts" proposal which provides the same checks via attributes. It was scheduled for C++20, but later removed for lack of consensus on its scope. See p1823r0 and a standard committee member's Reddit thread 导致删除的理由。

除了 GSL 之外,Excepts 也存在于 C++20 中而不是 C++17 中,语法略有不同