能否在c ++ 17中通过using-declaration继承复制/移动构造函数?

问题描述 投票:0回答:1
struct B {
  B(int) {}
  B(B const&) {}
};

struct D: B {
  using B::B;
};

int main(void) {
  B b(5);
  D d(b); // error
  return 0;
}

c ++ 14在12.9 [class.inhctor] / p3中从继承的构造函数中明确排除了复制/移动构造函数。

对于继承的候选集中的每个非模板构造函数没有参数或没有参数的构造函数以外的构造函数复制/移动具有单个参数的构造函数,构造函数为隐式声明具有相同的构造函数特性,除非在用户声明的构造函数中,具有相同的签名出现使用声明或构造函数的完整类将是该类的默认,复制或移动构造函数。

但是我在c ++ 17中找不到任何详细描述。 clang / gcc显示不继承基类的复制/移动构造函数。有人可以提供标准中说明的内容吗?谢谢。

c++14 c++17 using-declaration inherited-constructors
1个回答
0
投票

我认为您需要最新的C ++草案中的namespace.udecl

[检查C ++ 17的措词-是的,该措辞也在C ++ 17中使用]

我不认为C ++ 17的行为会改变,只是措辞有所改变。


0
投票

继承的构造函数的工作方式已在C ++ 14和C ++ 17之间完全改变。作为标准的缺陷,编译器供应商很可能甚至针对其C ++ 14版本也选择修复此问题。

[C0基本上说,当选择了基类构造函数时,则将派生类初始化为默认情况下的构造函数,只是将选定的构造函数用于基类。

复制并移动派生类new definition中的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.