C++11 无限制联合示例

2023-12-20

I read http://www.stroustrup.com/C++11FAQ.html#unions http://www.stroustrup.com/C++11FAQ.html#unions

但我无法编译给定的示例:

union U1 {
    int m1;
    complex<double> m2; // ok
};

union U2 {
    int m1;
    string m3;  // ok
};

U1 u;       // ok
u.m2 = {1,2};   // ok: assign to the complex member

结果是:

main.cpp:85:8: error: use of deleted function 'U1::U1()'
     U1 u;       // ok
        ^   
main.cpp:75:11: note: 'U1::U1()' is implicitly deleted because the default definition would be ill-formed:
     union U1 {
           ^   
main.cpp:77:25: error: union member 'U1::m2' with non-trivial 'constexpr std::complex<double>::complex(double, double)'
         complex<double> m2; // ok
                         ^   
main.cpp:86:5: error: 'u' does not name a type
     u.m2 = {1,2};   // ok: assign to the complex member
     ^   
make: *** [main.o] Error 1

问题:

我认为在非限制联合中,如果没有手动给出默认构造函数,将构造第一个元素。这是真的吗?如何编写一个工作示例?

下面的也不会编译:

class Y
{   
    public:
        constexpr Y() {}
};  

union X
{   
    int a;
    float b;
    Y x;
    //X(){}
};  

X x;

int main(){}

同样的错误信息:

main.cpp:112:7: error: use of deleted function 'X::X()'
     X x;
       ^   
main.cpp:104:11: note: 'X::X()' is implicitly deleted because the default definition would be ill-formed:
     union X
           ^   
main.cpp:108:11: error: union member 'X::x' with non-trivial 'constexpr Y::Y()'
         Y x;
           ^   
make: *** [main.o] Error 1

在标准中,第 2 段(注释中)提到的 [class.union] 告诉我们:

联合体可以有成员函数(包括构造函数和 析构函数),但不是虚拟(10.3)函数。工会不得有 基类。联合不得用作基类。如果有工会 包含引用类型的非静态数据成员的程序是 格式不正确。联合体中至多一个非静态数据成员可以有一个 大括号或等于初始化器。 [注意:如果a的任何非静态数据成员 union 有一个不平凡的默认构造函数(12.1),复制构造函数 (12.8)、移动构造函数 (12.8)、复制赋值运算符 (12.8)、移动 赋值运算符(12.8),或析构函数(12.4),相应的 联合体的成员函数必须由用户提供,否则将被 为联合隐式删除(8.4.3)。 ——尾注]

由于您的类没有默认构造函数,因此编译失败。

第 3 段甚至提供了一个例子:

union U {
int i;
float f;
std::strings;
};

并说 :

由于 std::string (21.3) 声明了所有特殊成员函数的非平凡版本,因此 U 将具有隐式删除的默认构造函数、复制/移动构造函数、复制/移动赋值运算符和析构函数。要使用 U,这些成员函数中的部分或全部必须由用户提供。


Bjarne 写了同样的事情:

如果联合体的成员具有用户定义的构造函数、复制函数或析构函数,则该特殊函数将被删除;也就是说,它不能用于联合类型的对象。这是新的。

但错误的例子。两个都std::string and std::complex有非默认构造函数。因此,与这些的联合需要联合的构造函数。

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

C++11 无限制联合示例 的相关文章

随机推荐

  • 翻译 WordPress 插件标题

    如何翻译 WordPress 插件标头 我已经使用以下方法翻译了插件中的所有字符串 and e 功能 po 文件 文本域 WordPress 加载语言文件的函数 load plugin textdomain mnbaa seo false
  • 为什么我的 As400 无法从新创建的成员别名中进行选择?

    我已经按照此描述设置了代码question https stackoverflow com questions 346512 sql query of multi member file on as400 创建别名和删除别名一样有效 对于我
  • 不使用reverse() 或[::-1] 反转字符串?

    我遇到了一个奇怪的 Codecademy 练习 它需要一个函数 该函数将字符串作为输入并以相反的顺序返回它 唯一的问题是你不能使用相反的方法或 stackoverflow 上的常见答案 1 显然 在现实的编程世界中 人们很可能会选择扩展切片
  • WinForm 应用程序中的 Microsoft 报表教程

    我在我的 WinForm 应用程序项目中使用 Microsoft Report 我对表达式 组 甚至过滤器和其他许多东西有一些问题 我正在寻找 Microsoft Report 的完整教程 但直到现在我还没有找到任何教程 可以你帮我找个教程
  • 静态变量初始化顺序

    C 保证编译单元 cpp 文件 中的变量按照声明的顺序进行初始化 对于编译单元的数量 这一规则分别适用于每个编译单元 我指的是类之外的静态变量 但是 变量初始化的顺序在不同的编译单元中是未定义的 我在哪里可以看到关于 gcc 和 MSVC
  • Log4cplus RollingFileAppender 是否异步

    我将为我们的应用程序添加 Log4cplus 我们的应用程序是用 C 编写的 并且是多线程的 我想使用 Log4Cplus RollingFileAppender 来实现同样的目的 我知道Log4Cplus源自Java Log4j 由于我不
  • 在集群内运行 kubectl

    我有一个 Kubernetes 1 10 集群已启动并正在运行 使用以下命令 我创建一个在集群内运行 bash 的容器 kubectl run tmp shell rm i tty image centos bin bash 我在正在运行的
  • 将对象转换为键值对象数组,例如 `{ name: "Apple", value: "0.6" }`

    我有一个这样的对象 const total Apple 0 6 Banana 0 6 Orange 1 Grapes 0 4 Pineapple 0 4 现在我想将其转换为键值对象数组 其中每个对象具有相同的两个属性集 name and v
  • gnuplot 中带有参数图的 for 循环

    我正在尝试在 gnuplot 4 6 中绘制多个参数曲线 在早期版本 4 4 中 命令 set para 为 a 1 10 a cos t a sin t 绘制 pi pi 参数模式和迭代之间的语法歧义是当前 gnuplot 版本中已记录的
  • 如何提取 vcxproj 中每个编译单元的编译参数?

    我正在尝试获取每个编译单元的编译参数 以便我可以创建 编译命令 json http clang llvm org docs JSONCompilationDatabase html 对于我的 vcxproj 它可以与 clang 的 lib
  • 如何在 Cython 中使用 128 位整数

    在我的 64 位计算机上long long类型有 64 位 print sizeof long long prints 8 我需要使用 128 位整数 幸运的是海湾合作委员会支持这些 https gcc gnu org onlinedocs
  • 如何读取 PDF 文本矩阵

    我正在编写一个程序来直接从我的程序创建 PDF 文件 我已经使用了 PDF 参考手册 并设法弄清楚除了一件事之外的所有内容 文本矩阵 它一定是我读过的最令人困惑的东西 谷歌搜索 重新阅读 重新谷歌搜索 重新阅读 但仍然不理解它 就在我以为我
  • 元刷新和重定向页面?

    我创建了一个带有 META 标记的网页 如下所示 问题是移动浏览器不支持此元标记 尽管它确实在每个浏览器上的网络中正确重定向 网页的完整代码在这里
  • 无法使用 000webhost 连接到数据库

    我正在尝试学习 php 但是当我尝试连接到 mysql 数据库时 出现此错误 我认为代码本身没有任何问题 但主机端可能有错误 我使用的是000webhost 警告 mysqli mysqli mysqli mysqli 28000 1045
  • 如何修复“参数列表太长”错误?

    我执行了这个命令 从文件夹 train 中的大量文件 大约 3000 个 中删除所有出现的 perl pi e s g Users Kian Desktop Acsegment espslabs train 但我得到了这个错误 bin ba
  • 单词表-uima ruta

    实际上我在Wordlist中使用了一些CITY名称和PUBLISHERS名称 根据我的理解 Wordlist将注释文档中任何列表项的所有出现 但是我发现一个问题 当我更改列表项的顺序时 出现的次数增加或减少列表中的文本 例如 Script
  • WebApi Route 返回 Not Found in Orchard Module

    我正在创建一个 Orchard 模块 我想在其中添加 WebApi 控制器 我的模块 txt Name ModuleName AntiForgery enabled Author The Orchard Team Website http
  • 处理 XXX.js 的源映射花费的时间比 YYY 毫秒长,因此我们继续执行而不等待所有断点

    Edit 这实际上也发生在新创建的准系统 React Typescript 模板 ViteJS 应用程序上 并且零修改 在 App tsx 中放置断点会使 VS Code 调试器启动速度慢得难以忍受 原帖如下 我正在尝试 ViteJS 也许
  • 使用计时器间隔与任务延迟重复执行任务

    我正在实施一项预定的工作 例如方法 并已缩小到方法范围 一种实现计时器间隔 另一种基于任务延迟 我还考虑过使用 Azure 计时器触发的 Web 作业 但它们不能在多实例模式下工作 实际上 在多实例应用程序中 其中一个实例中仅触发一个触发器
  • C++11 无限制联合示例

    I read http www stroustrup com C 11FAQ html unions http www stroustrup com C 11FAQ html unions 但我无法编译给定的示例 union U1 int