为什么没有<stlfwd>标题,不存在它是否可以被视为缺陷?
Why is there no <stlfwd> header and can the non-existence of it be considered a defect?
标准库包括一个<iosfwd>
头,它(正向)声明所有流,包括任何typedef
s,并定义char_traits
模板,包括专用化。
遗憾的是,没有这样的<stlfwd>
标头(转发)声明所有常见的STL数据类型和函数,如vector
、map
、less
、sort
等。更遗憾的是根据,用户代码不允许将这样的声明/typedef
s添加到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
命名空间中声明),因为实现不允许添加任何隐藏/默认的模板参数。
我之所以这么问,是因为我正在考虑最终提交一份关于这方面的缺陷报告。
转发声明less
或sort
或任何其他算法的目的是什么?如果你传递一个通用算法,它几乎肯定是一个模板类型,根本不需要前向声明。
这就给我们留下了容器类型。在某些情况下,它们的前向声明肯定是有用的,但我怀疑它只是简单地决定,由于每个容器定义相对简单(与iostream相比),因此最好只使用完整的include,而不是<例如containerfwd>include。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- clang实现char8_t的方式是否存在缺陷,或者标准的某个黑暗角落是否禁止优化?
- 将模拟集中在[0.5,0.5,0.5]中,盒大小为1是否存在缺陷?
- 在多态对象上使用static_cast是否表明存在设计缺陷?
- 为什么没有<stlfwd>标题,不存在它是否可以被视为缺陷?