为什么没有<stlfwd>标题,不存在它是否可以被视为缺陷?

Why is there no <stlfwd> header and can the non-existence of it be considered a defect?

本文关键字:是否 缺陷 lt stlfwd gt 为什么 标题 不存在      更新时间:2023-10-16

标准库包括一个<iosfwd>头,它(正向)声明所有流,包括任何typedefs,并定义char_traits模板,包括专用化。

遗憾的是,没有这样的<stlfwd>标头(转发)声明所有常见的STL数据类型和函数,如vectormaplesssort等。更遗憾的是根据,用户代码不允许将这样的声明/typedefs添加到std名称空间

§17.4.3.1 [lib.reserved.names] p1:

除非另有指定,否则C++程序将声明或定义添加到命名空间std或命名空间std内的命名空间是未定义的。程序可以将任何标准库模板的模板专用化添加到名称空间std

是的,这涵盖了(正向)声明的情况,即使类型已经存在于标准库中。当然,即使添加了这样的声明,大多数(所有?)编译器也会表现得非常正常,但严格来说,从语言律师的角度来看,这是未定义的行为。我发现这对于typedef的标准容器来说尤其乏味,比如:

// how to forward declare map and string?
typedef std::map<std::string, std::string> Attributes;

现在,这可以被认为是一个缺陷吗?

我的意思是不存在<stlfwd>标头(或者更好的<stdfwd>,也包括<iosfwd>),并且禁止标准库中已经存在的声明。

此外,根据这个问题,如果一个(forward)完全按照标准要求声明标准容器、算法和函子/函数,那么代码应该是完全有效的(如果不是因为禁止用户在std命名空间中声明),因为实现不允许添加任何隐藏/默认的模板参数。

我之所以这么问,是因为我正在考虑最终提交一份关于这方面的缺陷报告。

转发声明lesssort或任何其他算法的目的是什么?如果你传递一个通用算法,它几乎肯定是一个模板类型,根本不需要前向声明。

这就给我们留下了容器类型。在某些情况下,它们的前向声明肯定是有用的,但我怀疑它只是简单地决定,由于每个容器定义相对简单(与iostream相比),因此最好只使用完整的include,而不是<例如containerfwd>include。