问题标签 [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.
c++ - 继承构造函数后查找基类名称
考虑以下代码:
直观地说,很明显这段代码是有效的,并且可以编译(用 gcc 和 clang 测试)。
但是,我想了解标准中的哪些内容使其有效。具体来说,我想了解名称查找base
in如何base foo()
找到基类类型而不是继承的构造函数。
这是我对标准措辞的分析,表明它应该解析为构造函数。这可能是错误的,但我想了解我哪里出错了。
我从[class.member.lookup] p1
:
成员名称查找确定类范围内名称 ( id-expression ) 的含义。[...] 对于id-expression,名称查找从类范围开始
this
p7
告诉我们名称查找的结果是什么:
[a member name]
f
在 [a class scope]中的名称查找结果是S(f, C)C
的声明集
我正在尝试使用C
beingderived
和f
正在使用base
in来遵循此过程base foo()
。
“声明集”定义在p3
:
in的查找集,称为S(f, C),由两个组件集组成:声明集,一组名为 的成员;[...]
f
C
f
p4
告诉我们声明集中的内容:
如果
C
包含 namef
的声明,则声明集包含 declare in 的每个声明f
,C
满足查找发生的语言构造的要求。
using base::base
是 ( ) 中名称( base
)f
的声明。该段继续举例说明声明不满足发生查找的语言构造的要求意味着什么,但没有任何内容可以排除在此查找之外。derived
C
using 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
)。[顺便说一句,即使名称查找继续进入基类范围,我也看不到任何可以在构造函数和注入的类名称之间消除歧义的东西]。
我的推理哪里出错了?
c++ - 继承构造函数(GCC 和 clang 不同意)
我正在尝试自定义std::function
并从以下代码开始:
我期望从中std::function
获取std::nullptr_t
对象的构造函数由my_function
. 因此,代码应该可以正常编译。虽然 GCC 5.2 (C++14) 在编译代码时没有问题,但 clang 3.6 (C++14) 产生了以下非常令人困惑的错误消息:
这是一个clang错误还是我的代码不正确?如果(非常幸运)后者是真的,我应该如何修复代码?
c++ - 默认情况下继承构造函数 noexcept(true) 吗?
在这里我发现:
继承构造函数 [...] 默认情况下都是 noexcept(true),除非它们需要调用 noexcept(false) 的函数,在这种情况下,这些函数是 noexcept(false)。
这是否意味着在下面的示例中,继承的构造函数是noexcept(true)
,即使它已noexcept(false)
在基类中明确定义,或者它本身被视为要调用的 noexcept(false) 函数?
c++ - 无法创建两个继承自 std::logic_error 的自定义异常类
我为我的 cs 类分配的任务是创建两个继承自 std::logic_error 的自定义异常类:OverflowingSwimmingPoolException 和 UnderflowingSwimmingPoolException。当尝试非法操作时,创建并抛出自定义异常,而不仅仅是打印错误消息。在驱动程序代码中包含 try...catch 块以捕获任何异常。
这是我的头文件的一部分:
这是编译器在构造函数所在的行上说的:“cs52::UnderflowingSwimmingPoolException”的构造函数必须显式初始化没有默认构造函数的基类“std::logic_error”。
这就是我的实现文件中的内容:
编译器在我抛出异常类的行中显示错误。它说:调用类 cs53:OverflowingSwimmimgPoolException 的私有构造函数。
我的驱动程序文件的一部分应该是这样的:
我刚刚开始编写代码,所以我不太了解已经在库中创建的 std::logic_error 之类的类是如何工作的。
c++ - 在 using-declaration 中,依赖名称可以在模板替换后呈现给构造函数吗?
在这个例子中:
T::X
是一个从属名称,指的是 中的成员X
。T
如果S<T>
用 实例化T = X
:
使用声明会变成继承构造函数吗?
Clang 拒绝代码DEMO,而 g++ 接受它。
请注意,如果我们写:
两个编译器都接受代码并将其视为继承构造函数。是否using T::X
允许按标准成为继承构造函数?
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;} 时,就会发生错误。
c++ - 所有版本的 GCC 都在使用默认成员初始化程序,它捕获了这一点,并结合了继承的构造函数
c++ - 从模板类继承并使用继承其构造函数
我想继承一个模板类,并使用“使用”来继承它的构造函数。但是当我调用移动构造函数时,“没有匹配的构造函数”失败
构建结果
java - java中构造函数的继承
每当在任何派生类中调用任何构造函数时,任务只能通过最终隐式或显式调用基类构造函数来完成(如果我在这里错了,请纠正我)。
由于我们打算创建派生类的实例,但由于基类的构造函数最终被调用。
那么,尽管调用了基类的构造函数,但如何构造派生类的实例呢?