问题标签 [inheriting-constructors]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
159 浏览

c++ - 继承构造函数后查找基类名称

考虑以下代码:

直观地说,很明显这段代码是有效的,并且可以编译(用 gcc 和 clang 测试)。

但是,我想了解标准中的哪些内容使其有效。具体来说,我想了解名称查找basein如何base foo()找到基类类型而不是继承的构造函数。

这是我对标准措辞的分析,表明它应该解析为构造函数。这可能是错误的,但我想了解我哪里出错了。

我从[class.member.lookup] p1

成员名称查找确定类范围内名称 ( id-expression ) 的含义。[...] 对于id-expression,名称查找从类范围开始this

p7告诉我们名称查找的结果是什么:

[a member name]f在 [a class scope]中的名称查找结果是S(f, C)C的声明集

我正在尝试使用Cbeingderivedf正在使用basein来遵循此过程base foo()

“声明集”定义在p3

in的查找集,称为S(f, C),由两个组件集组成:声明集,一组名为 的成员;[...]fCf

p4告诉我们声明集中的内容:

如果C包含 namef的声明,则声明集包含 declare in 的每个声明fC满足查找发生的语言构造的要求。

using base::base是 ( ) 中名称( base)f的声明。该段继续举例说明声明不满足发生查找的语言构造的要求意味着什么但没有任何内容可以排除在此查找之外。derivedCusing base::base

接下来,p3我们被告知如何处理声明集中的using-declarations :

在声明集中,使用声明被派生类的成员不隐藏或覆盖的指定成员集替换

那么using base::base指定哪些成员呢?在我看来,这是由以下人员回答的[class.qual] p2

在不忽略函数名称并且 嵌套名称说明符指定一个类的查找中C

  • 如果在nested-name-specifier之后指定的名称,当在 中查找时C,是 的注入类名C,或者

  • 在作为成员声明的using-declaration中,如果在嵌套名称说明符之后指定的名称与嵌套名称说明符的最后一个组件中的标识符[...]相同

该名称被认为是命名 class 的构造函数C

有一个脚注阐明了“不忽略函数名称的查找”的含义:

忽略函数名称的查找包括出现在嵌套名称说明符详细类型说明符基本说明符中的名称。

这些都不是所讨论的名称查找的情况,所以在我看来,这一段适用,并说using base::base指定了构造函数(这也是你直观地期望的,因为它是继承构造函数声明)。

在派生类范围内找到声明(指定基类构造函数)后,我们继续以下操作[class.member.lookup] p4

如果结果声明集不为空,则子对象集包含C自身,计算完成。

也就是说,由于名称查找在派生类范围内找到了结果,因此它不会继续在基类范围内查找(它会在其中找到注入的类名称 base)。[顺便说一句,即使名称查找继续进入基类范围,我也看不到任何可以在构造函数和注入的类名称之间消除歧义的东西]。

我的推理哪里出错了?

0 投票
0 回答
384 浏览

c++ - 继承构造函数(GCC 和 clang 不同意)

我正在尝试自定义std::function并从以下代码开始:

我期望从中std::function获取std::nullptr_t对象的构造函数由my_function. 因此,代码应该可以正常编译。虽然 GCC 5.2 (C++14) 在编译代码时没有问题,但 clang 3.6 (C++14) 产生了以下非常令人困惑的错误消息:

这是一个clang错误还是我的代码不正确?如果(非常幸运)后者是真的,我应该如何修复代码?

0 投票
1 回答
521 浏览

c++ - 默认情况下继承构造函数 noexcept(true) 吗?

在这里我发现:

继承构造函数 [...] 默认情况下都是 noexcept(true),除非它们需要调用 noexcept(false) 的函数,在这种情况下,这些函数是 noexcept(false)。

这是否意味着在下面的示例中,继承的构造函数是noexcept(true),即使它已noexcept(false)在基类中明确定义,或者它本身被视为要调用的 noexcept(false) 函数

0 投票
1 回答
591 浏览

c++ - noexcept,继承构造函数和实际上完整的不完整类型的无效使用

我不确定这是GCC编译器的错误还是noexcept.
考虑以下示例:

如果noexcept被删除,它会编译。
无论如何,就像在示例中一样,我从 GCC v5.3.1 中得到了这个错误:

据我所知,struct D不是一个不完整的类型,但是语句中涉及到继承构造函数,看起来编译器实际上是在考虑基础结构的完整性而B不是D.

这是预期的行为还是法律法规?

为清楚起见:

  • 这里使用clang 3.7.1编译成功
  • 这里使用GCC 5.3.0编译失败

有关更多详细信息,请参阅此链接到 GCC 编译器的bugzilla
目前,该错误仍未得到证实。我会尽快更新问题。

0 投票
3 回答
603 浏览

c++ - 无法创建两个继承自 std::logic_error 的自定义异常类

我为我的 cs 类分配的任务是创建两个继承自 std::logic_error 的自定义异常类:OverflowingSwimmingPoolException 和 UnderflowingSwimmingPoolException。当尝试非法操作时,创建并抛出自定义异常,而不仅仅是打印错误消息。在驱动程序代码中包含 try...catch 块以捕获任何异常。

这是我的头文件的一部分:

这是编译器在构造函数所在的行上说的:“cs52::UnderflowingSwimmingPoolException”的构造函数必须显式初始化没有默认构造函数的基类“std::logic_error”。

这就是我的实现文件中的内容:

编译器在我抛出异常类的行中显示错误。它说:调用类 cs53:OverflowingSwimmimgPoolException 的私有构造函数。

我的驱动程序文件的一部分应该是这样的:

我刚刚开始编写代码,所以我不太了解已经在库中创建的 std::logic_error 之类的类是如何工作的。

0 投票
1 回答
179 浏览

c++ - 在 using-declaration 中,依赖名称可以在模板替换后呈现给构造函数吗?

在这个例子中:

T::X是一个从属名称,指的是 中的成员XT如果S<T>用 实例化T = X

使用声明会变成继承构造函数吗?

Clang 拒绝代码DEMO,而 g++ 接受它。

请注意,如果我们写:

两个编译器都接受代码并将其视为继承构造函数。是否using T::X允许按标准成为继承构造函数?

0 投票
1 回答
47 浏览

c++ - 继承构造函数(ISO 2011 sec 12.9 para 7)

我正在尝试 ISO 2011 sec 12.9 第 7 段中的示例。以下是我要编译的代码

$g++ -std=c++11 sample.cpp 错误信息

这是 gcc 中的错误吗?为什么要寻找 B1()?我使用的是 gcc 6.3.0

编辑:链接问题中的问题是关于何时使用一个基类。即以下代码

哪个有效,但是当引入 D2(int){chk=0;} 时,就会发生错误。

0 投票
2 回答
442 浏览

c++ - 所有版本的 GCC 都在使用默认成员初始化程序,它捕获了这一点,并结合了继承的构造函数

这个故事与我之前的问题类似。所有支持C++11的 GCC 版本都具有这种确切的行为。我找不到任何其他与我的测试用例作斗争的编译器。

测试用例:


住在godbolt.com


这段代码使用clang(3.4 到 4.0)、icc(16、17)、Visual C++(19.00.23506)编译。

如果我用手写版本替换构造函数继承,那么 GCC 开始编译代码:


住在godbolt.com


显然它不是很方便,特别是当你有很多这样的类,并导致样板代码。基本上,继承构造函数旨在解决的问题。在这种情况下,GCC 的这种行为使这个很棒的c++11功能不可用。

所以我真的很好奇我是否在做违反标准的事情,或者这是 GCC 中的错误?


编辑:

提交了错误报告

0 投票
1 回答
62 浏览

c++ - 从模板类继承并使用继承其构造函数

我想继承一个模板类,并使用“使用”来继承它的构造函数。但是当我调用移动构造函数时,“没有匹配的构造函数”失败

构建结果

0 投票
2 回答
556 浏览

java - java中构造函数的继承

每当在任何派生类中调用任何构造函数时,任务只能通过最终隐式或显式调用基类构造函数来完成(如果我在这里错了,请纠正我)。

由于我们打算创建派生类的实例,但由于基类的构造函数最终被调用。

那么,尽管调用了基类的构造函数,但如何构造派生类的实例呢?