首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unordered_set::find和noexcept

unordered_set::find和noexcept
EN

Stack Overflow用户
提问于 2015-12-17 16:03:35
回答 1查看 582关注 0票数 0

我有以下unordered_set:

代码语言:javascript
复制
class ArtifactImpl{...};

class ArtifactSetKeyOps
{
  public:
    std::size_t operator()(const ArtifactImpl& artifact) const noexcept;
    bool operator()(const ArtifactImpl& lhs, const ArtifactImpl& rhs) const noexcept;
};

std::unordered_set<ArtifactImpl,
  ArtifactSetKeyOps,ArtifactSetKeyOps> artifactSet_;

注意,我的散列和谓词模板参数/s有一个my以外的规范。

  • unordered_set::find有可能抛出吗?

我知道find没有标记为not,但实际上find不应该执行分配.

  • 从除标记函数以外的任何函数调用find是否可以接受?

例如:

代码语言:javascript
复制
const ArtifactImpl& foo() noexcept
{
  auto pos = artifactSet_.find(key);
  //etc...
}

尽管上面的foo()与find的to以外的规范相反,但我想知道规范是否具有实际的当且仅当一个人提供了自己的 above (散列和比较除外)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 16:31:16

tl;dr: noexcept似乎只对移动构造函数/赋值操作符有用。

如果您敢接受cplusplus.com,甚至是我作为足够的权威:它不会抛出任何异常,除非方面抛出-例如分配程序或比较器抛出,没有什么抛出。

(我现在应该去找出相关的ISO通道了.)

然而,就我的理解而言,noexcept在这里并不特别有用:

Andrzej在他的博客上有一个详细的解释。,其中我(Mis)引用了以下相关部分:

  • 如果尽管有规范,如果实现抛出的话,noexcept不会买很多东西
  • 它无助于实现无抛出异常安全保证
  • 除了一种与移动语义相关的情况外,不太可能启用重要的优化:

对于某些函数,如vector<T>::push_back,使用T的移动构造函数/赋值而不是复制构造函数/赋值可以显著提高性能。但是,如果这个移动构造函数/赋值可能会抛出,push_back将失去强大的异常安全保证。为了利用移动操作(在可能的情况下),同时保持强大的保证,需要有一种方法来确定给定的移动操作是否可能抛出,并使用它,或者返回到好的旧复制。这正是std::move_if_noexcept函数所做的,但它需要将T的操作标记为to,除非在适当的地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34339021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档