我应该在 C++ 的大多数函数中使用 noexcept 说明符和 noexcept 运算符吗?

问题描述 投票:0回答:1

我对 C++ 编程语言还是个新手,我正在尝试学习新东西。

我正在实现一个非常非常基本的迭代器/reverse_iterator 类和其他标准库容器。

我在大多数标准库实现中看到,例如 GCC、MS 和其他库,他们在大多数函数中使用

noexcept
说明符和
noexcept
运算符来测试它们是否抛出异常。

这是一个例子:

_GLIBCXX17_CONSTEXPR
        reverse_iterator(const reverse_iterator<_Iter>& __x)
    _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(__x.current)))
    : current(__x.current)
    { }

_GLIBCXX_NODISCARD
      _GLIBCXX17_CONSTEXPR iterator_type
      base() const
      _GLIBCXX_NOEXCEPT_IF(noexcept(_Iterator(current)))
      { return current; }

但是,有些部分他们不使用它们,就像这样:

template<typename _Iterator>
    _GLIBCXX_NODISCARD
    inline _GLIBCXX17_CONSTEXPR bool
    operator==(const reverse_iterator<_Iterator>& __x,
           const reverse_iterator<_Iterator>& __y)
    { return __x.base() == __y.base(); }

我知道如果一个函数被标记为

noexcept
,编译器可以执行一些优化,并且也知道只需要在知道该函数(或调用内部其他函数)不会抛出异常的地方使用。

据我了解,使用此处是因为我们正在使用模板,并且我们正在测试该类型是否抛出(如果我错了,请纠正我)。

那么,在什么情况下我需要在函数中使用

noexcept
说明符和
noexcept
运算符来测试不抛出?

而且,从上面使用比较运算符的示例来看,他们为什么不使用

noexcept

我可以标记那些比较运算符

noexcept
或测试它们是否为
noexcept

c++ function throw noexcept
1个回答
0
投票

我在几个网站上做了一些研究,发现了很好的信息,扩展了我在

noexcept
用法方面的知识。

阅读完Andrzej 的 C++ 博客后。 使用 noexcept 我了解

noexcept
如何更好地工作以及何时使用它以及何时避免它。

从我在问题中介绍的示例中,我想知道为什么在这种特殊情况下,如果众所周知将函数/构造函数标记为编译器可以执行的

operator==
,则
noexcept
不使用
noexcept
一些优化,我最终得出的结论是,如果我在该特定函数中使用它,则不会有性能增益。

换句话说,

operator==
不需要
noexcept
规范,因为代码本身没有性能增益,因为不涉及类似移动的操作或需要其他类型的不抛出异常保证。最后,
operator==
被标记为
inline constexpr
,它将内联所使用的函数,因此这会提高该特定代码的性能。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.