Xeo*_*Xeo 10 c++ std forward-declaration defects language-lawyer
标准库包括一个<iosfwd>头,(forward)声明所有流,包括任何typedefs,并定义char_traits模板,包括特化.
遗憾的是,不存在这样<stlfwd>的是(正向)宣布所有常见的STL的数据类型和功能,如头vector,map,less,sort等.甚至更不幸的是,用户代码不允许这种声明/添加typedefs到的std名称空间,如每
§17.4.3.1 [lib.reserved.names] p1:
除非另有说明,否则C++程序未定义向命名空间内的命名空间或命名空间添加声明或定义.程序可以将任何标准库模板的模板特化添加到命名空间.
stdstdstd
是的,它涵盖(前向)声明的情况,即使标准库中已存在类型.当然,即使添加了这样的声明,大多数(所有?)编译器也会表现得非常正常,但严格来说,语言律师说,这是未定义的行为.我觉得这typedef对标准容器来说特别乏味,比如:
// how to forward declare map and string?
typedef std::map<std::string, std::string> Attributes;
Run Code Online (Sandbox Code Playgroud)
现在,这可以被视为缺陷吗?
我的意思是不存在<stlfwd>标题(或者更好<stdfwd>,也包括覆盖<iosfwd>)和标准库中已经存在的声明禁令.
此外,根据这个问题,如果一个(转发)完全按照标准的要求声明标准容器,算法和仿函数/函数,那么代码应该是完全有效的(如果不是禁止用户自己的声明)该std命名空间),因为实现是不允许添加任何隐藏/默认的模板参数.
我问这个是因为我想最终提交一份有关此问题的缺陷报告.
什么是向前声明说的目的less或者sort还是真的任何其它的算法?如果您传递一个通用算法,它几乎肯定会作为模板类型,根本不需要前向声明.
这给我们留下了容器类型.肯定有一些情况下,它们的前向声明会有用,但我怀疑只是因为每个容器定义相对简单(与iostream相比),所以最好只使用完整的include而不是<containerfwd> include例如.