在定义可见性方面,该标准对undreded_set的Value类型提出了哪些要求

What requirements does the standard impose on the Value type of unordered_set in terms of definition visibility

本文关键字:类型 Value set 方面 可见性 定义 标准 undreded      更新时间:2023-10-16

我正在创建一个包含unordered_set的类,该类具有自己的散列和谓词,如下所示:

//SetHolder.h
#include <unordered_set>
struct SetHolder
{
    SetHolder(); //Defined in SetHolder.cpp
    ~SetHolder(); //Defined in SetHolder.cpp
    struct ArtifactImpl; //Defined in SetHolder.cpp
    struct ArtifactSetKeyOps
    {
      std::size_t operator()(
        const ArtifactImpl& artifact) const noexcept;
      bool operator()(
        const ArtifactImpl& lhs, const ArtifactImpl& rhs) const;
    };
    std::unordered_set<ArtifactImpl,
      ArtifactSetKeyOps,ArtifactSetKeyOps> artifactSet_;
};

我在ubuntu-linux(stdlibc++)下使用gcc 4.8.2编译器,并且我观察到,如果我只使用cpp文件中的unordered_set,它只在声明ArtifactImpl时编译。然而,我需要提供ArtifactSetKeyOps的定义(为什么,我不明白)。

  • 标准对类型的unordered_set在声明unordered_set
  • 这段代码应该适用于所有平台吗?此外,如果是,为什么哈希谓词需要在声明期间可见unordered_set

std::unordered_mapstd::unordered_set在这方面对其模板参数没有特殊要求,因此适用库范围内的通用规则。哪个是C++14 17.6.4.8/2.5:

特别是,在以下情况下,影响是不明确的:

  • 如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非该组件特别允许

因此,如果值类型、哈希类型或谓词类型不完整(在您的情况下是这样),则存在Undefined Behavior。

由于这个要点特别指出"templatecomponent",而该子句的其余部分则指函数,我认为这意味着类模板也是"模板组件"。在您的情况下,类模板在SetHolder类的定义中的artifactSet_成员的定义处实例化。