c++ 11中提出的无限制联合是什么?
What are Unrestricted Unions proposed in C++11?
我认为unrestricted unions
是c++ 11中提出的功能之一。有人能解释一下这背后的语义和它提供的优势吗?
维基百科上有解释:http://en.wikipedia.org/wiki/C%2B%2B0x#Unrestricted_unions
在询问c++ 0x特性解释之前先在那里搜索。
不受限制的联合
在标准c++中对什么类型有限制Of对象可以是联合的成员。例如,联合不能包含任何对象定义了一个非平凡的构造函数。c++ 0x将减轻一些问题在这些限制中,允许工会用于更多的类型以前是不允许使用的[6]。这是a的一个简单例子c++ 0x允许的联合:
//for placement new #include <new> struct Point { Point() {} Point(int x, int y): x_(x), y_(y) {} int x_, y_; }; union U { int z; double w; Point p; // Illegal in C++; point has a non-trivial constructor. // However, this is legal in C++0x. U() { new( &p ) Point(); } // No nontrivial member functions are //implicitly defined for a union; // if required they are instead deleted // to force a manual definition. };
更改不会破坏任何现有的代码,因为他们只放松当前规则。
这就是我们一直拥有的旧联合,一个对象每次包含一个不同类型的成员。
变化只是现在允许在联合中存储非pod类型。但是,您将负责显式地构造和销毁该成员。
从N3242:[示例:考虑一个具有非静态数据的联合类型u的对象u成员m为m类型,n为n类型,如果m有非平凡析构函数n有非平凡构造函数(例如,如果它们声明或继承虚函数),则可以安全地切换u的活动成员使用析构函数和位置new操作符从m到n,如下所示:
u.m。~ M ();new (&u.n) N;
-end example]
它扩展了union以允许任何类型,而不仅仅是"普通的旧数据",从而使您能够更灵活地在同一位置存储不同类型的数据,而无需诉诸手动指针攻击。
你为此付出的代价是你必须做一些仔细的簿记。使用普通的旧数据联合赋值就足以改变"当前类型"。读取错误的类型很可能导致数据乱码,但仅此而已。对于非普通的旧数据联合,您必须跟踪当前类型,并手动调用正确的构造函数和析构函数来更改当前类型,并在销毁整个联合时正确地清理。如果你试图读或写的是书面形式,不好的事情可能会发生
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- c++ 11中提出的无限制联合是什么?