什么是_Tp和_Up?

hel*_*vio -2 c++ macros templates stl

检查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   };
Run Code Online (Sandbox Code Playgroud)

我正在尝试理解复制构造函数及其注释的含义,并决定这是否是一个简单的可复制类.

Max*_*kin 6

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

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

请参阅glibc 保留名称:

除了本手册中记录的名称外,保留名称还包括以下划线('_')开头的所有外部标识符(全局函数和变量)以及所有标识符,无论使用哪个以下划线开头,或者下划线后跟一个下划线大写字母是保留名称.这样,库和头文件可以为内部目的定义函数,变量和宏,而不会有与用户程序中的名称冲突的风险.


qua*_*dev 5

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

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

例如(来自<functional>

  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; }
Run Code Online (Sandbox Code Playgroud)

或者

template<typename _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
  bool
  operator()(const _Tp& __x, const _Tp& __y) const
  { return __x < __y; }
};
Run Code Online (Sandbox Code Playgroud)

编辑:

这同样适用于complex您在编辑中显示的模板:_Tp设计模板参数,即您可以将模板用作:

std::complex<double> c1;
std::complex<float> c2;
Run Code Online (Sandbox Code Playgroud)