基类构造函数的using声明

5
using 一开始看起来是用于将特定函数(例如使用 using std::cout )导入到范围内。但是,这个 using 实际上会将基类的所有构造函数导入到派生类中。这个 using 声明背后实际上隐藏着什么?
template< typename T >
class Vec : public std::vector< T >
{
public:
    using std::vector<T>::vector;  // ?

    //...
};


这并不是什么“背后”的东西。那就是它的功能。 - Raymond Chen
当你问“实际上背后是什么”,你是想知道为什么标准定义它那样,还是想知道它在哪里有用? - R Sahu
也许它只是看起来与我所使用和理解的有些不同。它导入了所有构造函数(而不是特定的函数)。另外,由于它是公共继承的,据说所有基类构造函数应该已经可用了(即为什么需要“using”)。谢谢。 - artm
[...] 应该已经可用了 [...]. -- @artm 从我观察来看,通过派生类的名称无法获得具有相同语义的带参数构造函数。 - Wolf
1个回答

5
,基类的构造函数默认情况下是不会被继承的。关于这个问题的详细解释可以在以下讨论中找到:
这个`using`声明的背后实际上是什么?
根据cppreference.com,`using`有以下作用:
1. 使用声明可以将命名空间成员引入其他命名空间和块作用域,或者将基类成员引入派生类定义中。 2. [...](特定于...)
此外,在继承时也可以使用。
如果using声明引用的是正在定义的类的直接基类的构造函数(例如using Base::Base;),那么在初始化派生类时,该基类的所有构造函数(忽略成员访问)都会对重载决议可见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接