C++ 你在说什么?

C++ 你在说什么?,c++,templates,macros,stl,C++,Templates,Macros,Stl,在查看STL库的源代码时,我遇到了指定模板变量的宏Tp和Up。它们的定义在哪里?两者之间的区别是什么?为什么要使用这样的宏?我找不到有关此编程策略的任何信息 编辑:我指的是GCC STL库,特别是复杂类,它是一个模板类,内容如下: 00115 template<typename _Tp> 00116 class complex 00117 { 00118 public: 00120 typedef _Tp value_type; 00121

在查看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   };
00115模板
00116类综合体
00117     {
00118公众:
00120类型定义值类型;
00121
00124复合体(常数Tp&==Tp(),常数Tp&==Tp());
00125
00126//让编译器合成复制构造函数
00127//complex(const complex&);
00129模板
00130复合体(常数复合体&);
00776   };

我试图理解复制构造函数及其注释的含义,并确定这是否是一个普通的可复制类。

所有以下划线开头,后跟大写字母的名称都保留用于实现

这是因为如果他们使用
T
而不是
\u Tp
T
可以是用户定义的宏,这将破坏标准库

见glibc:

除本手册中记录的名称外,保留名称还包括所有以下划线(“u1”)开头的外部标识符(全局函数和变量),以及所有以两个下划线或一个下划线后跟大写字母开头的标识符(无论其用途如何),均为保留名称。这样,库文件和头文件就可以为内部目的定义函数、变量和宏,而不会与用户程序中的名称发生冲突


我假设您正在查看GNU标准库实现,libstdc++使用那些名称作为模板参数,它们是而不是

这样的名称是为实现保留的(以下划线开头,后跟大写字母)是保留的

e、 g.(来自


我假设您并没有真正关注SGI的STL,而是关注编译器的标准库实现。任何以下划线和大写字母开头的内容都将保留给编译器&标准库,因此这是一个实现细节。如果你想让我们帮助你解决这些问题,你至少要发布它们(最好说明它们来自哪个编译器、标准库和版本)。我认为这条评论中有一个拼写错误,应该是“让编译器合成副本构造函数”,也就是说,它是隐式定义的。模板构造函数不是复制构造函数,注释后应该有一个空行。我会修复它。复制构造函数必须是非模板。默认的复制构造函数仍然存在,并将用于复制构造函数。该模板仅在从不同类型构造时使用,例如从
complex
构造
complex
,因此
\u Up
永远不能与
\u Tp
是同一类型。我将用默认的副本构造函数替换注释:
complex(const complex&)=default(仅为C++11模式定义,但这将比混乱的注释更好地记录正在发生的事情)谢谢!我想我应该问一个不同的问题,因为你的解释似乎很明显。谢谢!答案似乎确实微不足道。我想我应该问一个不同的问题,关于我编辑的最后一句话。。。
  template<typename _Tp, typename _Up>
auto
_M_call(_Tp&& __object, _Up * const *) const noexcept
-> decltype((*std::forward<_Tp>(__object)).*std::declval<__pm_type&>())
{ return (*std::forward<_Tp>(__object)).*__pm; }
template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
  bool
  operator()(const _Tp& __x, const _Tp& __y) const
  { return __x < __y; }
};
std::complex<double> c1;
std::complex<float> c2;