gpt4 book ai didi

c++ - 为什么没有 header ,它的不存在可以被视为缺陷吗?

转载 作者:可可西里 更新时间:2023-11-01 16:10:50 31 4
gpt4 key购买 nike

标准库包含一个 <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 namespace std unless otherwise specified. A program may add template specializations for any standard library template to namespace std.

是的,这涵盖了(前向)声明的情况,即使标准库中已经存在类型。当然,即使添加了这样的声明,大多数(所有?)编译器也会表现得非常正常,但严格来说,语言律师来说,这是未定义的行为。我发现这对 typedef 来说特别乏味。 ing 标准容器,例如:

// how to forward declare map and string?

typedef std::map<std::string, std::string> Attributes;

现在,这可以被视为缺陷吗?

我的意思是 <stlfwd> 的不存在 header (或更好的 <stdfwd> ,也涵盖 <iosfwd>)和对标准库中已存在的声明的禁令。

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

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

最佳答案

前向声明 lesssort 或任何其他算法的目的是什么?如果您传递通用算法,它几乎肯定会作为模板类型,根本不需要前向声明。

剩下的就是容器类型了。肯定存在它们的前向声明有用的情况,但我怀疑它只是简单地决定,因为每个容器定义相对简单(与 iostreams 相比),最好只使用完整的 include 而不是 include例如。

关于c++ - 为什么没有 <STLfwd> header ,它的不存在可以被视为缺陷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313771/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com