【发布时间】:2016-01-17 04:16:10
【问题描述】:
我正在编写一个应该非常高效的迭代器,我想知道是否可以将运算符 operator->() 和 operator*() 声明为 noexcept,因为它们只会在底层指针上调用相同的运算符(但如果指针是指向一个不可用的内存部分,那么程序很可能会崩溃)?
【问题讨论】:
标签: c++ exception iterator c++14 noexcept
我正在编写一个应该非常高效的迭代器,我想知道是否可以将运算符 operator->() 和 operator*() 声明为 noexcept,因为它们只会在底层指针上调用相同的运算符(但如果指针是指向一个不可用的内存部分,那么程序很可能会崩溃)?
【问题讨论】:
标签: c++ exception iterator c++14 noexcept
为什么需要?你的编译器知道你的代码,如果你从不抛出你在操作符中所做的事情,你就不会得到异常处理开销。
但是,如果您在这些运算符中执行可能会抛出的某些操作,则从语义上讲,您不能使用说明符(除非您希望程序在抛出时立即退出)。
我个人认为noexcept 不会产生任何可衡量的性能提升,但在最模糊的极端情况下——支持它的编译器生成的后端代码不会对不抛出的代码造成性能损失。对我来说,noexcept 更像是一种语言特性,它以编译时可检查noexcept(expression) operator 的形式出现。比较Bjarne's FAQ。
【讨论】: