【发布时间】:2014-08-29 09:47:45
【问题描述】:
检查 STL 库的源代码时,我发现了指定模板变量的宏 _Tp 和 _Up。它们在哪里定义,两者之间有什么区别?为什么要使用这样的宏?我找不到有关此编程策略的任何信息。
编辑:我指的是 GCC STL 库,特别是复杂的类,它是一个模板类,其内容如下:
00115 template<typename _Tp>
00116 class complex
00117 {
00118 public:
00120 typedef _Tp value_type;
00121
00124 complex(const _Tp& = _Tp(), const _Tp & = _Tp());
00125
00126 // Lets the compiler synthesize the copy constructor
00127 // complex (const complex<_Tp>&);
00129 template<typename _Up>
00130 complex(const complex<_Up>&);
00776 };
我正在尝试理解复制构造函数及其注释的含义,并确定这是否是一个可简单复制的类。
【问题讨论】:
-
我假设您并没有真正查看 SGI 的 STL,而是查看编译器的标准库实现。任何以下划线后跟大写字母开头的内容都是为编译器和标准库保留的,因此它是一个实现细节。如果您希望我们帮助解决这些特定问题,您至少必须发布它们(最好说明它们来自哪个编译器、标准库和版本)。
-
我认为该评论中有一个错字,应该说“让编译器合成复制构造函数”,即它是隐式定义的。模板构造函数不是复制构造函数,注释后应该有一个空行。我会解决的。
-
复制构造函数必须是非模板。
-
默认的复制构造函数仍然存在,将用于复制构造。模板只会在从不同类型构造时使用,例如从
complex<double>构造complex<float>,所以_Up永远不能和_Tp是同一类型。 -
我将用默认的复制构造函数替换注释:
complex(const complex&) = default;(仅针对 C++11 模式定义,但这比令人困惑的注释更能记录正在发生的事情)