经常讨论无法向前声明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
的实现)。