在类中,“using Base::BaseOfBase;”应该做什么?

2023-11-26

考虑这段代码:

#include <iostream>
#include <type_traits>

struct A
{
    A(int x) {std::cout << "A(" << x << ")\n";}
};

struct B : A
{
    using A::A;
    B(int x, int y) : A(x) {std::cout << "B(" << x << "," << y << ")\n";}
};

struct C : B
{
    using B::A; // <--

    // C() : B(0,0) {}
};

int main()
{
    C c(1);
}

gcc.godbolt.org

它在 GCC 上编译并打印A(1),这意味着一个实例B是在没有调用构造函数的情况下“构造”的。如果你取消注释C(), then C c(1);不再编译(GCC找不到合适的构造函数)

Clang 没有说什么using B::A;,但拒绝编译C c(1);(也找不到合适的构造函数)。

MSVC 正好停在using B::A;,基本上是说你只能从直接基类继承构造函数。

偏好设置没有提到从间接基继承构造函数,所以它似乎是不允许的。

这是 GCC 和 Clang 的 bug,还是这里发生了什么?


构造函数不是继承的。主要是因为

[命名空间.udecl]

3在用作成员声明的 using 声明中,每个 using-declarator 的嵌套名称说明符应命名一个基类 正在定义的类。如果 using 声明符命名了一个构造函数, 其嵌套名称说明符应命名该类的直接基类 被定义。

但最关键的是B::A甚至根本没有命名构造函数。

[等级.质量]

2在不忽略函数名称并且 嵌套名称说明符指定一个类 C:

  • 如果在 C 中查找时,在嵌套名称说明符之后指定的名称是 C 的注入类名称(子句 [class]),或者
  • 在作为成员声明的 using 声明的 using 声明符中,如果在 嵌套名称说明符与标识符或 simple-template-id 的 template-name 在最后一个组件中 嵌套名称说明符,

相反,该名称被视为命名类 C 的构造函数。 [ 注意:例如,构造函数不是可接受的查找 导致一个详细的类型说明符,因此构造函数不会 用于代替注入的类名。 ——《尾注》]这样的 构造函数名称只能在 a 的 declarator-id 中使用 命名构造函数的声明或在 using 声明中。 [ 例子:

struct A { A(); };
struct B: public A { B(); };

A::A() { }
B::B() { }

B::A ba;            // object of type A
A::A a;             // error, A​::​A is not a type name
struct A::A a2;     // object of type A

—《示例结束》]

上述两条都不适用。所以B::A不是构造函数的名称。这只是注入的类名A,它已经可以用于C。我想这应该就像从基类引入任何旧类型定义一样。 IE。 Clang 会让你定义

C::A a(0);

这看起来是正确的。这样做的唯一用处是如果B继承自protected A。在这种情况下,默认情况下注入的类名也将无法访问,直到使用 using 声明提出。修改你的例子godbolt证实了这一点。

MSVC 可能过于热衷于彻底拒绝此代码。

至于哪个编译器是正确的,C++20引入了通过括号内的值列表进行聚合初始化. C是一个集合体,所以C c(1);实际上是聚合初始化c通过使用1复制初始化B子对象。所以不需要继承构造函数C使此代码有效。

GCC 确实正在这样做(因为显式地设置 c'tors 会导致它拒绝代码),而 Clang 似乎还没有实现P0960 yet.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在类中,“using Base::BaseOfBase;”应该做什么? 的相关文章

  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 如何检查 .NET 4.0 中的泛型参数是否是动态的

    我有课ObjectMapper
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • CMake 警告:无法为目标生成安全的链接器搜索路径

    在为 pcl 项目运行 CMake 时 我收到一条警告消息 Configuring done CMake Warning at CMakeLists txt 12 add executable Cannot generate a safe
  • 首先EntityFramework数据库 - 类型映射 - 将binary(8)从SQL映射到C#中的int

    在 SQL 内部 我有一个主键为二进制 8 的表 当我使用该表添加到我的模型中时Update Model from Database我可以看到该列有 type Binary 在 C 中 我将该列设为byte 我可以将该列映射到 int 吗
  • Type_traits *_v 变量模板实用程序顺序无法编译

    看过了这个答案 https stackoverflow com a 31763111 7151494 我试图想出一个变量模板从中获取代码的实用程序 template
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • IClaimsTransformation 未触发

    我尝试过实施一个IClaimsTransformation我在 ASP NET CORE 3 1 Web 应用程序中找到的类 public class ClaimsTransformer IClaimsTransformation publ
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 向每个收件人发送一封包含不同内容的电子邮件(使用抄送字段)

    在你因为这个问题 毫无意义 和 不可能 而驳回之前 请听我说完 问题 我们在使用我们的系统发送的每封电子邮件中实施跟踪像素 即具有唯一 URL 的可下载 GIF 文件 这有助于我们跟踪电子邮件的打开情况 问题是 当我们抄送一些收件人时 跟踪
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • 统一;随机物体移动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在制作一款机器人战斗游戏 我希望敌人随机移动 然后有时会向敌人移动 我希望运动包含在其中的代码 else if avoid fal
  • 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

    我有一个继承自基类模板的类模板 基类模板有一个数据成员和一个成员函数模板 我想从我的超类中调用它 我知道为了消除对成员函数模板的调用的歧义 我必须使用template关键字 我必须明确引用this在超级班里 this gt base mem
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一

随机推荐

  • Laravel 样式表和 javascript 不会加载非基本路由

    好吧 我知道这是一个非常基本的问题 但我无法弄清楚 这是一个关于 Laravel 的问题 基本上 我将样式表嵌入到我的默认布局视图中 我目前只是使用常规 css 来链接它们 例如 当我处于单级路线时 例如 about 但是当我深入时停止工作
  • 类 C 语言中的返回类型多态性

    为什么我们没有看到类似 C 的语言允许在返回类型中具有多态性的可调用对象 我可以看到附加类型推断将成为一个障碍 但我们有很多语言具有成熟的类型推理系统 适用于不同级别的 工作 Edit 通过返回类型多态性 我的意思是仅在返回类型中重载函数签
  • 使用 TextDecoder/TextEncoder 将 ArrayBuffer 转换为 String,然后返回 ArrayBuffer,返回不同的结果

    我有一个 ArrayBuffer 它是通过使用 Frida 读取内存而返回的 我将 ArrayBuffer 转换为字符串 然后使用 TextDecoder 和 TextEncoder 返回 ArrayBuffer 但结果在此过程中发生了变化
  • Java 中保存连接字符串参数的配置文件

    我有 ASP Net 背景 我现在正在编写一个Java 程序 将数据从DB2 数据库导入到Oracle 数据库中 我已经完成了导入此数据的基本功能 我遇到的问题是 我将所有连接属性都编码到了 Java 程序本身中 是否有任何 最佳实践 方法
  • CSS:如何使光标成为输入文件上的指针?

    当鼠标悬停时 如何使光标成为输入文件或输入文本上的指针 我尝试过 但当然行不通
  • password_hash 的盐存储在哪里?

    根据 相对 新的 PHP 文档 The 密码哈希值函数使用随机盐 我们不应该担心 O O 所以如果我理解正确 盐必须存储在某个地方 否则用户在注册网站后将无法登录 不同的盐 gt 不同的哈希值 该函数文档没有告诉任何有关与数据库交互的信息
  • 是否有基于其他运算符自动提供的 C++ 运算符重载? [复制]

    这个问题在这里已经有答案了 假设我正在写一个int包装器并需要提供每个操作符重载 作者是否必须列出每一项 还是可以根据作者提供的内容自动生成任何一项 编译器是否可以从现有的运算符中推断出任何新的自动定义运算符 如果我定义operator 它
  • 在 iOS 7 中强制横向和自动旋转

    我的应用程序应该只是横向的 在构建时我没有遇到任何问题iOS 6和更早的时候 现在与iOS 7 它根本不会旋转 在我的应用程序设置中 我将其设置为仅横向左 右 在我的视图控制器中 我使用以下内容 NSUInteger supportedIn
  • 如何在 web.config 文件中更改我的 asp.net 网站的默认时区

    我正在尝试更改我的 asp net 网站的默认时区 我尝试了以下代码 但它不起作用
  • 如何为 List 实现 Parcelable

    我正在尝试在我的可打包中传递一个列表 public class MetaDados implements Parcelable private List
  • 哈希表与 C++ 中的 STL 映射

    我正在尝试学习 C 地图 只是想知道STL图的实现 我读到它采用了二叉搜索树 STL中有哈希表的实现吗 STL映射到底是如何存储键值对的 典型的 STL 实现基于红黑树 C TR1 提供了 std tr1 unordered map 它使用
  • 如何在 JMeter 中进行 OAuth 2.0 身份验证?

    我正在尝试对一些需要身份验证的 API OAuth 2 0 进行功能测试 并在 JMeter 中进行模拟 我正在尝试验证 Azure 云的 OAuth 服务 有没有人能够成功创建 JMeter HTTP 请求来针对 OAuth 2 0 进行
  • 在文本选择上显示自定义菜单

    您好 我希望能够在用户选择一些与媒体提供的文本非常相似的文本时显示自定义菜单 或上下文菜单 如何实现这样的事情 我知道本机 jquery 上下文菜单插件 但我如何知道用户何时选择文本 浏览器的onselect似乎仅在输入元素上受支持 这是一
  • PHP 的合并函数?

    许多编程语言都有合并函数 返回第一个非 NULL 值 example 遗憾的是 2009 年 PHP 还没有做到这一点 在 PHP 本身获得合并函数之前 在 PHP 中实现一个合并函数的好方法是什么 php 5 3 中有一个新的运算符可以执
  • 如何在 cmd start 中使用引号?

    这是我想做的事 start wait c Program Files NetDrive2 nd2cmd exe c m t ftp blabla If I do start wait c Program Files NetDrive2 nd
  • 如何在 Anaconda Env 中启动 Visual Studio Code

    我在 Windows 10 PC 上的 Visual Studio Code 中运行 Python 程序时遇到问题 当我从终端启动 python 会话并说import cv2我没有收到任何错误 当我通过命令提示符并启动时VSCode从环境中
  • 为什么 UI 元素必须始终从 UI 线程创建/更新?

    为什么 UI 元素必须始终从 UI 线程创建 更新 在 几乎 所有编程语言中 UI 元素只能从 UI 线程安全地访问 修改 我知道这是一个标准的并发访问和同步问题 但真的有必要吗 这种行为是由编程语言还是操作系统强加的 有没有什么编程语言可
  • Django - 仅包含日期部分的分组

    MyModel objects filter created at gte 2011 03 09 created at lte 2011 03 11 values created at status annotate status coun
  • 作为 Cowboy 客户端,您如何使用 Gun?

    我跟着入门说明对于 Cowboy 我让 Cowboy 在端口 8080 上运行并侦听 然后我得到了Hello Erlang 当我进入时的回应http localhost 8080在我的浏览器中 现在 如何使用 Gun 连接到 Cowboy
  • 在类中,“using Base::BaseOfBase;”应该做什么?

    考虑这段代码 include