language-lawyer相关内容
从 http://en.cppreference.com/w/cpp/string/byte/memcpy : 如果对象不是 TriviallyCopyable (例如标量,数组,C兼容结构),行为未定义。 在我的工作中,我们使用 std :: memcpy 很长时间不使用TriviallyCopyable的位交换对象: void swapMemory(Entity * ePt
..
请注意:此问题已重命名并缩小,以使其更加集中和可读。 根据标准,不同对象的对象类型可能不共享相同的内存位置。所以这不是合法的: std :: array短裤; int * i = reinterpret_cast(shorts.data()); // Not OK 然而,标准允许此规则的例外:通过指向 char 或 unsig
..
这段代码是否有效(以及定义的行为)? int& nullReference = * ; g ++和clang ++编译时没有任何警告,即使使用 -Wall , -Wextra , -std = c ++ 98 , -pedantic , -Weffc ++ ... 实际上是null,因为它不能被访问(它将意味着解引用一个空指针),但是我们可以通过检查它的地址
..
C ++代码可以同时符合 C ++ 03 标准和 C ++ 11 标准,但根据正在编译的标准执行不同的操作? 解决方案 答案是肯定的。在正面有: 以前隐式复制对象的代码现在会隐式移动它们。 在消极方面,标准附录C列出了几个例子。 字符串文字 #define u8“abc” const char * s = u8“def”; //以前的“abcdef”,现在为“d
..
PREMISE: C ++ 11标准将表达式分为三个不相交的值类别: lvalues , xvalues 和 prvalues (§3.10 / 1)。有关什么值类别的说明,例如 此处 。 我很难了解不同运算符对他们的值类别有什么要求操作数。第3.10 / 1段规定: [...]每个表达式都属于此分类中的一个基本分类:lvalue,xvalue ,或prvalue。表达式的此属性
..
请考虑以下代码: int main() { int count = 0; int arrInt [2] = {count ++,count ++}; return 0; } 如果我们使用 clang -std = c ++ 03 会产生以下警告( live example ): 警告:多次无序修改'count'[-Wunsequenced]
..
C ++ 11标准的第14.8.2 / 8段规定了替换失败将导致或不会导致“硬”编译错误(从而导致编译失败)或“软”错误的条件这将导致编译器从一组用于重载解析的候选者中丢弃模板(不会使编译失败并启用众所周知的SFINAE成语): 如果替换导致无效的类型或表达式,类型扣除将失败。无效的类型或表达式 是一个如果使用替换参数写入将是不成形的。 [注意:访问检查是作为替换过程的 部分完成的。 -
..
考虑这两个函数: void foo(){} void bar(){} 是保证& foo!=& bar 同样, 模板 ? MSVC积极地COMDAT折叠函数,因此具有相同实现的两
..
对不起,再次打开这个主题,但是思考这个主题本身已经开始给我一个未定义的行为。 int i = 0; int v [10]; i = ++ i; // Expr1 i = i ++; // Expr2 ++ ++ i; // Expr3 i = v [i ++]; // Expr4 我认为上面的表达式 $ b operator =(i,operato
..
通过我阅读C ++标准,我一直认为C ++中整数基本类型的大小如下: sizeof(char)
..
代码: #include bool foo(double& m) { m = 1.0; return true; } int main() { double test = 0.0; std :: cout
..
C ++ 11引入了一个标准化的内存模型,但是究竟是什么意思? Herb Sutter说在这里, 内存模型意味着C ++代码 现在具有一个标准化的库调用 无论谁编译器 和它运行的平台是谁。 有一个标准的方法来控制如何 不同的线程与 处理器的内存谈话。 “当你谈论拆分 [code]在不同的核心, 在标准中,我们在谈论 的内存模型。我们将 优化它,而不打破 假设
..
到目前为止,我找不到如下推论: int * ptr; * ptr = 0; 是未定义的行为。 所有,有5.3.1 / 1表示 * 意指间接,将 T * 转换为 T 。 然后经常引用3.7.3.2/4说,对非空指针使用解除分配函数会使指针无效,并且后来对无效指针的使用是UB。 如何在上面的代码中推导出UB? 解决方案 第4.1节
..
gcc 无需警告即可编译以下代码: #include struct foo { static constexpr double a = std :: cos(3。); static constexpr double c = std :: exp(3。); static constexpr double d = std :: log(3。); stat
..
也许我不是来自这个星球,但在我看来,以下应该是语法错误: int a [] = {1,2,}; //最后的额外逗号 但它不是。我感到惊讶,当这段代码编译在Visual Studio,但我已经学会了不信任MSVC编译器就C ++规则,所以我检查了标准,它 允许的标准以及。如果你不相信我,你可以看到8.5.1的语法规则。 为什么允许这样做?这可能是一
..
Herb Sutter在他的网站上发布了一篇2008年的文章: 有一个积极的建议, C ++ 0x并且需要空终止,并且可能禁止写时拷贝实现,出于并发的原因。这是文章: http://www.open-std.org/ jtc1 / sc22 / wg21 / docs / papers / 2008 / n2534.html 。我认为本文中的一个或两个建议都可能被采纳,但我们将在下一次会议上
..
在Stack Overflow问题 在C ++ 11中不允许重定义lambdas,为什么? ,a小程序没有编译: int main(){ auto test = [] {}; test = [] {}; } 问题得到解答,似乎都很好。然后 Johannes Schaub 发表了一个有趣的观察结果: 如果您输入 所以我很好奇:为什么
..
C ++标准在3.3.2“声明点”中包含了一个半知名的名称查找示例: int x = x; 这会自行初始化 x 是原始类型)是未初始化的,因此具有不确定的值(假设它是一个自动变量)。 这是否是未定义的行为? 根据4.1“Lvalue-to-rvalue转换”,对未初始化的值执行Lvalue-to-Rvalue转换是未定义的行为。右侧 x 是否进行此转
..
我的印象是,访问联合成员而不是最后一个是UB,但我似乎找不到一个坚实的参考(除了答案 因此,它是未定义的行为吗? 解决方案 混淆是C明确允许通过联合类型冲突,而C ++( c ++ 11 )没有这样的权限。 c11 的问题 6.5.2.3结构和联合成员 95)如果用于读取union对象的内容的成员不同于最后用于 的成员在对象中存储一个值,该值的对象表示的适当部分被
..
如中所述,初始化是否包含左值到右值转换?是 int x = x; UB? C ++标准在部分有一个惊人的例子3.3.2 int 使用自己的不确定值初始化的声明点: int x = 12; {int x = x; } 这里,第二个x被初始化为自己的(不确定)值。 - end example ] 这个问题的Johannes答案表示未定义行为,
..