经常讨论无法向前声明std::string和std::wstring的问题。据我了解,原因是这些类型是模板类basic_string的实例化的类型定义:

namespace std {
  typedef basic_string<char>    string;
  typedef basic_string<wchar_t> wstring;
}

而且,该语言不允许类型声明的正向声明。

对于使用继承而不是typedef的c++标准,会不会更好:
namespace std {
  class string : public basic_string<char> {};
  class wstring : public basic_string<wchar_t> {};
}

这样我们就可以向前声明std::string和std::wstring?

最佳答案



没有。

std::basic_string不能以任何形式继承。此限制允许实现std::basic_string,因为它没有虚拟函数表,因此创建和销毁它的成本(更快)便宜得多。

如果需要定义std::[w]字符串,只需#include即可。

编辑(回答评论)

C++(和标准库)的指导原则之一是“不要为不使用的东西付费”。这意味着代码是以这样一种方式编写的,即您不必为不需要的功能招致运行时成本。

如果每个实例都有一个虚拟表,则创建一个std::string实例将更加昂贵(这将使用std::string,这在性能关键的代码中是不允许的)。

相反,std::string旨在作为C char*机制的快速,类型安全的RAII实现。同样,您不应尝试从std::vector,列表, map ,shared_ptr,unique_ptr等继承。

如果您确实需要字符串基类,请考虑自己编写your_namespace::[w]string_base(一个简单的实现是在内部封装std::[w]string的实现)。

09-07 05:30