0

C++11 标准中的 7.3.3.p1 和 p3 两段都引用了命名构造函数的using 声明。为什么这是必要的?下面的代码显示了A在派生类中可以看到基类的构造函数,B正如预期的那样。

class A
{
    int i;

    public:
    A() : i(0) {}
    A(int i) : i(i) {}
};

class B : public A
{
    public:
//  using A::A;
    A f1() { return A(); }
    A f2() { return A(1); }
};

int main()
{
    B b;
    A a1 = b.f1();
    A a2 = b.f2();
}

如果我在上面注释掉using A::A;程序执行没有任何变化。

4

1 回答 1

3

这意味着从父类继承非默认构造函数,A(int i)在这种情况下。在 main 中更改您的声明,如下所示:

int main()
{
    B b(42);  // Want to forward this to A::A(int)
    ...
}

如果没有该using A::A子句,您将收到以下编译器错误(至少从 g++ 4.8.0 开始):

co.cpp: In function ‘int main()’:
co.cpp:20:11: error: no matching function for call to ‘B::B(int)’
     B b(42);
           ^
co.cpp:20:11: note: candidates are:
co.cpp:10:7: note: B::B()
 class B : public A
       ^
co.cpp:10:7: note:   candidate expects 0 arguments, 1 provided
co.cpp:10:7: note: constexpr B::B(const B&)
co.cpp:10:7: note:   no known conversion for argument 1 from ‘int’ to ‘const B&’
co.cpp:10:7: note: constexpr B::B(B&&)
co.cpp:10:7: note:   no known conversion for argument 1 from ‘int’ to ‘B&&’

但是,如果您将using A::A声明添加回来,它会干净地编译。 b(42)最终打电话A::A(int i)

于 2013-07-08T17:34:35.180 回答