我对 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
?
我在几个网站上做了一些研究,发现了很好的信息,扩展了我在
noexcept
用法方面的知识。
阅读完Andrzej 的 C++ 博客后。 使用 noexcept 我了解
noexcept
如何更好地工作以及何时使用它以及何时避免它。
从我在问题中介绍的示例中,我想知道为什么在这种特殊情况下,如果众所周知将函数/构造函数标记为编译器可以执行的
operator==
,则noexcept
不使用noexcept
一些优化,我最终得出的结论是,如果我在该特定函数中使用它,则不会有性能增益。
换句话说,
operator==
不需要noexcept
规范,因为代码本身没有性能增益,因为不涉及类似移动的操作或需要其他类型的不抛出异常保证。最后,operator==
被标记为 inline constexpr
,它将内联所使用的函数,因此这会提高该特定代码的性能。