我有以下unordered_set:
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以外的规范。
我知道find没有标记为not,但实际上find不应该执行分配.
例如:
const ArtifactImpl& foo() noexcept
{
auto pos = artifactSet_.find(key);
//etc...
}尽管上面的foo()与find的to以外的规范相反,但我想知道规范是否具有实际的当且仅当一个人提供了自己的 above (散列和比较除外)。
发布于 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,除非在适当的地方。
https://stackoverflow.com/questions/34339021
复制相似问题