- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
标准库包含一个 <iosfwd>
header ,(向前)声明所有流,包括任何 typedef
s 并定义了 char_traits
模板,包括专业。
遗憾的是,没有这样的 <stlfwd>
header (向前)声明所有常见的 STL 数据类型和函数,如 vector
, map
, less
, sort
等等。更可悲的是,用户代码不允许添加这样的声明/typedef
s 到 std
命名空间,根据
§17.4.3.1 [lib.reserved.names] p1
:
It is undefined for a C + + program to add declarations or definitions to namespace
std
or namespaces within namespacestd
unless otherwise specified. A program may add template specializations for any standard library template to namespacestd
.
是的,这涵盖了(前向)声明的情况,即使标准库中已经存在类型。当然,即使添加了这样的声明,大多数(所有?)编译器也会表现得非常正常,但严格来说,语言律师来说,这是未定义的行为。我发现这对 typedef
来说特别乏味。 ing 标准容器,例如:
// how to forward declare map and string?
typedef std::map<std::string, std::string> Attributes;
现在,这可以被视为缺陷吗?
我的意思是 <stlfwd>
的不存在 header (或更好的 <stdfwd>
,也涵盖 <iosfwd>
)和对标准库中已存在的声明的禁令。
此外,根据 this question ,如果一个(前向)完全按照标准要求声明标准容器、算法和仿函数/函数,则代码应该是完全有效的(如果不是因为禁止用户在 std
命名空间中声明) ,因为不允许实现添加任何隐藏/默认模板参数。
我问这个是因为我正在考虑最终提交一份关于此的缺陷报告。
最佳答案
前向声明 less
或 sort
或任何其他算法的目的是什么?如果您传递通用算法,它几乎肯定会作为模板类型,根本不需要前向声明。
剩下的就是容器类型了。肯定存在它们的前向声明有用的情况,但我怀疑它只是简单地决定,因为每个容器定义相对简单(与 iostreams 相比),最好只使用完整的 include 而不是
关于c++ - 为什么没有 <STLfwd> header ,它的不存在可以被视为缺陷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313771/
标准库包含一个 header ,(向前)声明所有流,包括任何 typedef s 并定义了 char_traits模板,包括专业。 遗憾的是,没有这样的 header (向前)声明所有常见的 ST
我是一名优秀的程序员,十分优秀!