C++ 继承构造函数并提供新重载:没有参数基构造函数似乎不参与重载解析

C++ 继承构造函数并提供新重载:没有参数基构造函数似乎不参与重载解析,c++,overloading,c++14,inheriting-constructors,C++,Overloading,C++14,Inheriting Constructors,测试显示了一种奇怪的行为(c++14,g++4.9.1,clang3.5.5): 总而言之: 如果B不提供其他构造函数,则可以使用A::A() 如果B提供了其他构造函数,则它不能使用A::A(),但它使用A::A(无论参数是什么),这是意外的行为(至少对我而言) 设置1: struct A { A() {}; A(int) {}; // with or without this overload the result are the same }; struct B : A {

测试显示了一种奇怪的行为(
c++14
g++4.9.1
clang3.5.5
):

总而言之:

  • 如果
    B
    不提供其他构造函数,则可以使用
    A::A()
  • 如果
    B
    提供了其他构造函数,则它不能使用
    A::A()
    ,但它使用
    A::A(无论参数是什么)
    ,这是意外的行为(至少对我而言)

设置1:

struct A {
  A() {};
  A(int) {}; // with or without this overload the result are the same
};

struct B : A {
  using A::A;
};

B b0{}; // OK
设置2:

struct A {
  A() {}; // with a default constructor instead (empty class A)
          // the results are the same
};

struct B : A {
  using A::A;
  B(int){}
};

B b0{}; // no matching constructor
B b1{24}; // OK
设置3:

struct A {
  A() {};
  A(int) {};
};

struct B : A {
  using A::A;
  B(int, int){}
};

B b0{}; // no matching constructor
B b1{24}; // OK
B b2{24, 42}; // OK


为什么会发生这种情况,以及如何“修复”这种情况。我不能告诉你这种情况的理由,但我至少可以告诉你,这是标准规定的:

[C++11:12.9/3]
:对于继承构造函数的候选集中的每个非模板构造函数,除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外,除非出现using声明的类中存在具有相同签名的用户声明的构造函数,否则构造函数将使用相同的构造函数特征隐式声明。[……]

由于默认的
B()
调用默认的
A()
,您可以这样“修复”它:

struct B : A
{
   B() = default;

   using A::A;
   B(int, int){}
};
() 下面的(n2540)表明,这个修复的简单性和对称性或多或少是这个决定背后的驱动因素,尽管我仍然觉得这有点不令人满意。哦,好吧

复制和默认构造函数不转发,遵从隐式声明复制/默认构造函数的现有规则


默认构造函数是特殊的。您可以“修复”它,例如,通过编写显式声明默认构造函数并将其设置为默认值:
B()=default我猜继承构造函数无法“复制”默认构造函数的某些属性,例如琐碎性,因此有特殊规则。这些是您正在使用的确切示例,它们不起作用还是我不起作用?你能提供一个实时链接吗?i、 e或@dyp你是对的。为什么不把你的评论写进一个答案中呢?;)这些例子不应该是真实的。首先,你没有继承任何东西。请创建一个.sry,我键入而不是复制,修复了继承。