单元测试以检查C ++方法的`noexcept`属性

Ant*_*hov 2 c++ unit-testing cmake noexcept c++17

我有几种方法

  • 必须标记noexcept
  • 不得标记noexcept

如何编写单元测试以检查noexcept正确标记的方法?

原因:确保将来在其他开发人员或本人的邪恶版本重构期间不会更改这些属性。

当前,我使用CMake / CTest并将手写的可执行文件添加到测试套件中。

Nik*_* C. 5

noexcept也是运算符。您可以在静态断言中使用它:

void foo() noexcept { }
void bar() { }

static_assert(noexcept(foo())); // OK
static_assert(noexcept(bar())); // Will fail
Run Code Online (Sandbox Code Playgroud)

如果它是成员函数,则:

struct S {
    void foo() noexcept { }
};

static_assert(noexcept(S().foo()));
Run Code Online (Sandbox Code Playgroud)

没有函数调用或执行任何操作。该noexcept操作仅检查表达式,它实际上并没有进行评估。

要要求一定不要noexcept使用某个功能,只需使用即可!noexcept(bar())

  • 请注意,如果`S`不是默认可构造的,您还可以使用`noexcept(declval <S>()。foo())`代替`noexcept(S()。foo())`。 (2认同)
  • `std :: declval`方法的另一个好处是:它允许您将`static_assert` _within_类放置在函数声明后的位置,因为`std :: declval <S>不需要完整()是有效的(并且noexcept的操作数expr将不计算)。即,您可以在类的定义中放置“ static_assert(noexcept(std :: declval <S>()。foo())))”,例如,在“ foo()”的声明(/ definition)下方。 (2认同)