10

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

遗憾的是,没有这样的头<stlfwd>文件(转发)声明所有常见的 STL 数据类型和函数 vector,如maplesssorttypedefstd

§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>)和禁止标准库中已经存在的声明。

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

我问这个是因为我正在考虑最终提交一份关于这个的缺陷报告。

4

1 回答 1

7

less向前声明 say或sort实际上任何其他算法的目的是什么?如果您要传递通用算法,几乎可以肯定它是模板类型,根本不需要前向声明。

这给我们留下了容器类型。在某些情况下,它们的前向声明会很有用,但我怀疑这只是决定,因为每个容器定义都相对简单(与 iostreams 相比),最好只使用完整的包含而不是 <containerfwd> 包含例如。

于 2011-06-11T03:44:26.467 回答