我的印象是访问union除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).
那么,这是不确定的行为?
正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
这很尴尬,但按位AND运算符在C++标准中定义如下(强调我的).
执行通常的算术转换; 结果是其操作数的按位AND功能.运算符仅适用于整数或无范围的枚举操作数.
这看起来对我来说毫无意义.据我所知,"按位AND函数"在标准中的任何地方都没有定义.
我知道AND功能已被充分理解,因此可能不需要解释."按位"一词的含义也应该相当清楚:该函数应用于其操作数的相应位.但是,操作数的位构成不清楚.
是什么赋予了?
[C++11: 1.7]以位为单位讨论字节:
C++内存模型中的基本存储单元是字节.一个字节至少足以包含基本执行字符集(2.3)的任何成员和Unicode UTF-8编码形式的八位代码单元,并由连续的位序列组成,其数量为实现定义.最低有效位称为低位; 最重要的位称为高位.C++程序可用的内存由一个或多个连续字节序列组成.每个字节都有一个唯一的地址.
但是,我找不到标准中定义"位"的任何地方.
那么说C++不会对可能由单个位表示的值的数量进行限制吗?
是否允许三态位?
这个问题与编程或特定的语言概念没有直接关系.我的问题是我们是否可以使用对C国际标准(例如C11)的引用来提供规范性参考来描述来自C图书馆的任何概念C++.
更具体地说,在标题中<climits>定义N3797::18.3.3 [c.limits]的C library标题中进行描述.但是C标准提供了关于<limits.h>内容而不是N3797工作草案的更全面的信息.
所以关于C library定义的内容对于定义C11的C++实现是否属实C++11,C library或者我们不能依赖于C标准提供的内容?