6

我读到有关过度使用noexcept可能会阻碍可测试库的担忧。

考虑:

T& vector::front() noexcept {
    assert(!empty());         // <- this may throw in some test-frameworks
    return data[0];
}

使用noexcept编译器的注释可能会优化异常代码,这将/可能阻止正确处理assert()(或作者想要在此处用于他的测试的任何函数)。

因此,我想知道,在库中从不使用无条件noexcept但始终将其与 am-I-in-a-test-condition“链接”是否可行。像这样:

#ifdef NDEBUG    // asserts disabled
static constexpr bool ndebug = true;
#else            // asserts enabled
static constexpr bool ndebug = false;
#end

T& vector::front() noexcept(ndebug) {
    assert(!empty());
    return data[0];
}

然后可能将其添加为宏(尽管我讨厌那样):

#define NOEXCEPT noexcept(ndebug)

T& vector::front() NOEXCEPT {
    assert(!empty());
    return data[0];
}

你怎么看?这有任何意义吗?还是不可行?还是不能解决问题?或者根本没有问题?:-)

4

1 回答 1

3

如果你不能证明一个函数不会发出异常,那么你不应该用noexcept. 就是这么简单。

这么说,noexcept(ndebug)对我来说似乎很合理。我认为没有理由将其隐藏在宏后面。模板函数通常有详细的noexcept条件。

如果资产中的函数可以在测试模式下抛出,那么您的程序可以std::terminate在测试模式下自发地抛出。assert(实际上这很像一个隐含的。)

我能看到的唯一缺点是,如果发生这种情况,您将不会收到行号和提示消息。noexcept(false)那,如果你从一个函数调用一个函数,编译器应该警告你noexcept(true),所以你可能会得到一些噪音。

于 2011-09-19T12:44:23.107 回答