【问题标题】:What are _Tp and _Up?_Tp 和 _Up 是什么?
【发布时间】: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&lt;double&gt; 构造complex&lt;float&gt;,所以_Up 永远不能和_Tp 是同一类型。
  • 我将用默认的复制构造函数替换注释:complex(const complex&amp;) = default;(仅针对 C++11 模式定义,但这比令人困惑的注释更能记录正在发生的事情)

标签: c++ templates macros stl


【解决方案1】:

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

这是因为如果他们使用T 而不是_TpT 可以是用户定义的宏,这会破坏标准库。

见 glibc Reserved Names:

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

【讨论】:

  • 谢谢!我想我应该问一个不同的问题,因为您的解释似乎很明显。
【解决方案2】:

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

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

例如(来自&lt;functional&gt;

  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; }
};

编辑:

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

std::complex<double> c1;
std::complex<float> c2;

【讨论】:

  • 谢谢!答案似乎确实微不足道。我想我应该问一个不同的问题,与我编辑的最后一句话有关......
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 2017-07-15
  • 2019-11-11
  • 2022-01-21
  • 1970-01-01
  • 2013-06-21
相关资源
最近更新 更多