标准库包含一个<iosfwd>
标头,它(前向)声明所有流,包括任何typedef
s 并定义char_traits
模板,包括特化。
遗憾的是,没有这样的头<stlfwd>
文件(转发)声明所有常见的 STL 数据类型和函数 vector
,如map
less
sort
typedef
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>
)和禁止标准库中已经存在的声明。
此外,根据这个问题,如果一个(转发)完全按照标准的要求声明标准容器、算法和仿函数/函数,则代码应该是完全有效的(如果不是禁止用户在命名空间) ,std
因为不允许实现添加任何隐藏/默认模板参数。
我问这个是因为我正在考虑最终提交一份关于这个的缺陷报告。