language-lawyer相关内容

允许带有`char *`的别名`T *`。是否也允许其他方式?

请注意:此问题已重命名并缩小,以使其更加集中和可读。 根据标准,不同对象的对象类型可能不共享相同的内存位置。所以这不是合法的: std :: array短裤; int * i = reinterpret_cast(shorts.data()); // Not OK 然而,标准允许此规则的例外:通过指向 char 或 unsig ..
发布时间:2016-10-11 22:01:39 C/C++开发

C ++:null引用

这段代码是否有效(以及定义的行为)? int& nullReference = * ; g ++和clang ++编译时没有任何警告,即使使用 -Wall , -Wextra , -std = c ++ 98 , -pedantic , -Weffc ++ ... 实际上是null,因为它不能被访问(它将意味着解引用一个空指针),但是我们可以通过检查它的地址 ..
发布时间:2016-10-11 21:58:05 C/C++开发

C ++代码在C ++ 03和C ++ 11中都是有效的,但是做不同的事情吗?

C ++代码可以同时符合 C ++ 03 标准和 C ++ 11 标准,但根据正在编译的标准执行不同的操作? 解决方案 答案是肯定的。在正面有: 以前隐式复制对象的代码现在会隐式移动它们。 在消极方面,标准附录C列出了几个例子。 字符串文字 #define u8“abc” const char * s = u8“def”; //以前的“abcdef”,现在为“d ..
发布时间:2016-10-11 21:52:51 C/C++开发

未指定时,C ++运算符的操作数的值类别是什么?

PREMISE: C ++ 11标准将表达式分为三个不相交的值类别: lvalues , xvalues 和 prvalues (§3.10 / 1)。有关什么值类别的说明,例如 此处 。 我很难了解不同运算符对他们的值类别有什么要求操作数。第3.10 / 1段规定: [...]每个表达式都属于此分类中的一个基本分类:lvalue,xvalue ,或prvalue。表达式的此属性 ..
发布时间:2016-10-11 21:51:31 C/C++开发

什么是“直接上下文”在SFINAE适用的C ++ 11标准中提到?

C ++ 11标准的第14.8.2 / 8段规定了替换失败将导致或不会导致“硬”编译错误(从而导致编译失败)或“软”错误的条件这将导致编译器从一组用于重载解析的候选者中丢弃模板(不会使编译失败并启用众所周知的SFINAE成语): 如果替换导致无效的类型或表达式,类型扣除将失败。无效的类型或表达式 是一个如果使用替换参数写入将是不成形的。 [注意:访问检查是作为替换过程的 部分完成的。 - ..
发布时间:2016-10-11 21:48:35 C/C++开发

C ++ 11引入了标准化的内存模型。这是什么意思?它如何影响C ++编程?

C ++ 11引入了一个标准化的内存模型,但是究竟是什么意思? Herb Sutter说在这里, 内存模型意味着C ++代码 现在具有一个标准化的库调用 无论谁编译器 和它运行的平台是谁。 有一个标准的方法来控制如何 不同的线程与 处理器的内存谈话。 “当你谈论拆分 [code]在不同的核心, 在标准中,我们在谈论 的内存模型。我们将 优化它,而不打破 假设 ..
发布时间:2016-10-11 20:51:18 C/C++开发

C ++标准在什么地方说dereferencing未初始化的指针是未定义的行为?

到目前为止,我找不到如下推论: int * ptr; * ptr = 0; 是未定义的行为。 所有,有5.3.1 / 1表示 * 意指间接,将 T * 转换为 T 。 然后经常引用3.7.3.2/4说,对非空指针使用解除分配函数会使指针无效,并且后来对无效指针的使用是UB。 如何在上面的代码中推导出UB? 解决方案 第4.1节 ..
发布时间:2016-10-11 20:51:06 C/C++开发

int a [] = {1,2,};允许使用逗号逗号。任何特别的原因?

也许我不是来自这个星球,但在我看来,以下应该是语法错误: int a [] = {1,2,}; //最后的额外逗号 但它不是。我感到惊讶,当这段代码编译在Visual Studio,但我已经学会了不信任MSVC编译器就C ++规则,所以我检查了标准,它 允许的标准以及。如果你不相信我,你可以看到8.5.1的语法规则。 为什么允许这样做?这可能是一 ..
发布时间:2016-10-11 20:43:52 C/C++开发

将std :: string总是在C ++ 11中以null终止?

Herb Sutter在他的网站上发布了一篇2008年的文章: 有一个积极的建议, C ++ 0x并且需要空终止,并且可能禁止写时拷贝实现,出于并发的原因。这是文章: http://www.open-std.org/ jtc1 / sc22 / wg21 / docs / papers / 2008 / n2534.html 。我认为本文中的一个或两个建议都可能被采纳,但我们将在下一次会议上 ..
发布时间:2016-10-11 20:41:48 C/C++开发

初始化是否需要进行左值到右值转换?是`int x = x;`UB?

C ++标准在3.3.2“声明点”中包含了一个半知名的名称查找示例: int x = x; 这会自行初始化 x 是原始类型)是未初始化的,因此具有不确定的值(假设它是一个自动变量)。 这是否是未定义的行为? 根据4.1“Lvalue-to-rvalue转换”,对未初始化的值执行Lvalue-to-Rvalue转换是未定义的行为。右侧 x 是否进行此转 ..
发布时间:2016-10-11 20:04:33 C/C++开发

访问不活动的联合成员和未定义的行为?

我的印象是,访问联合成员而不是最后一个是UB,但我似乎找不到一个坚实的参考(除了答案 因此,它是未定义的行为吗? 解决方案 混淆是C明确允许通过联合类型冲突,而C ++( c ++ 11 )没有这样的权限。 c11 的问题 6.5.2.3结构和联合成员 95)如果用于读取union对象的内容的成员不同于最后用于 的成员在对象中存储一个值,该值的对象表示的适当部分被 ..
发布时间:2016-10-11 19:51:53 C/C++开发

C ++标准是否改变了在C ++ 14中使用不确定值和未定义的行为?

如中所述,初始化是否包含左值到右值转换?是 int x = x; UB? C ++标准在部分有一个惊人的例子3.3.2 int 使用自己的不确定值初始化的声明点: int x = 12; {int x = x; } 这里,第二个x被初始化为自己的(不确定)值。 - end example ] 这个问题的Johannes答案表示未定义行为, ..
发布时间:2016-10-11 19:51:10 C/C++开发