【问题标题】:how do I replace base constructor call如何替换基本构造函数调用
【发布时间】:2022-01-23 22:04:28
【问题描述】:

在最近的 SO answer 中,部分 sn-p 我无法理解发生了什么,

struct VariableDepthList : std::variant<std::vector<VariableDepthList>, int> {
private:
    using base = std::variant<std::vector<VariableDepthList>, int>;
public:
    using base::base;
    VariableDepthList(std::initializer_list<VariableDepthList> v) : base(v) {}
};

base(v) 正在调用基类的ctor,如果是这样,则相当于没有using base::base

【问题讨论】:

  • 你不需要using base::base;部分来使用base(v):后者总是(独立于using声明)构造基础对象,using声明用于在您的VariableDepthList 中公开base ctor。
  • @DietmarKühl:如果using base::base 部分那么我看到了错误。 DEMO
  • 正如我所说:您不需要using 声明来定义ctor。根据您的使用情况,您可能需要它来绕过您的构造函数并直接使用基类的 ctor。由于没有std::initializer_list&lt;int&gt; 可行的构造函数,但{ 1 }std::initializer_list&lt;int&gt;,因此直接使用基类的构造函数。

标签: c++ constructor std-variant


【解决方案1】:

什么相当于没有using base::base

您将其替换为 base 的别名:

struct VariableDepthList : std::variant<std::vector<VariableDepthList>, int> {
private:
public:
    VariableDepthList(std::initializer_list<VariableDepthList> v) :
        std::variant<std::vector<VariableDepthList>, int>(v) // was "base(v)"
   {}
};

请注意,尽管没有usingbase class constructorsVariableDepthList 的用户将无法访问它们。

如果您确实希望基类构造函数可用,而不创建别名base

struct VariableDepthList : std::variant<std::vector<VariableDepthList>, int> {
private:
public:
    using std::variant<std::vector<VariableDepthList>, int>::variant;
    
    VariableDepthList(std::initializer_list<VariableDepthList> v) :
        std::variant<std::vector<VariableDepthList>, int>(v) // was "base(v)"
   {}
};

【讨论】:

  • 我看到同样的编译错误。 DEMO。我认为下面发生的不仅仅是替换。
  • @TruthSeeker 你得到一个编译错误,因为你没有使基类构造函数可用。我更新了答案。
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多