language-lawyer相关内容

在C ++ 11中,`i + = ++ i + 1'是否显示未定义的行为?

这个问题出现在我正在阅读(的答案)为什么是i = ++ i + 1明确定义C ++ 11? 我认为微妙的解释是(1)表达式 ++ i 返回一个左值,但 + 以prvalues作为操作数,因此必须执行从lvalue到prvalue的转换;这涉及获得该左值的当前值(而不是比旧值 i 大一个),因此必须在之后排序副作用从递增(即更新 i )(2)赋值的LHS也是一个左值,因此其值求值不涉及获取当前 ..
发布时间:2016-10-13 12:03:30 C/C++开发

C ++ - 为什么静态成员函数不能用'const'限定符创建

今天我有一个问题。我在需要一个静态成员函数,const不是必须的,但更好。但是,我没有成功我的努力。 c> 当你应用 const 限定符到非静态成员函数,它会影响 this 指针。对于 C 类的const限定成员函数,此指针的类型为 C const * ,而对于不是const限定的成员函数, this 指针的类型为 C * / code>。 静态成员函数没有 this 指针不是在类的特定实例 ..
发布时间:2016-10-13 11:57:46 C/C++开发

C ++ 14中引入的更改可能会破坏使用C ++ 11编写的程序?

简介 使用 C ++ 14 (aka。 C ++ 1y )标准在接近最终的状态,程序员必须问自己关于向后兼容性和与此有关的问题。 问题 在这个问题表示标准中有一个 专用于修订之间变更的信息。 如果可以解释前面提到的附录中的这些潜在问题,也许可以借助于与此处提到的内容相关的任何正式文档。 根据标准: C ++ 14中引入的更改可能会破坏使用C ++ 11编写的程序? ..
发布时间:2016-10-13 11:55:55 C/C++开发

C ++运算符%保证

是否保证( - x)%m ,其中 x 和 m c> - (x%m)是正的,在c ++ 标准(c ++ 0x) 我知道在我所知道的所有机器上都是正确的。 解决方案 除了 Luchian 的答案,这是C ++ 11标准的相应部分: 二元的/运算符产生商,二元的%运算符 产生第一个表达式除以 秒的余数。如果/或%的第二个操作数为零,则行为是 未定义。对于积分操作数,/运算符产生 ..
发布时间:2016-10-13 11:48:57 C/C++开发

空基类优化现在是一个强制性优化(至少对于标准布局类)?

根据 C ++ 11 9.1 / 7(draft n3376), standard-layout p> 没有非标准布局类型的非静态数据成员类型)或引用, 没有虚拟函数(10.3),没有虚拟基类(10.1), 对所有非静态数据成员具有相同的访问控制(条款11), 没有非标准布局基类, 在大多数派生类中没有非静态数据成员,最多一个基类具有非静态数据成员,或没有基类与非静态 ..
发布时间:2016-10-13 11:35:18 C/C++开发

C ++标准的核心语言规范中的注释和示例是否是非规范的?

通常在SO(和其他地方),我已经看到了C ++标准中的注释和示例不是规范性的声明 - 我可能已经做了这个声明了几次。 但是,我在C ++标准的核心语言规范中找不到这个事实的证据(目前我在查看n3979 C ++ 14工作草案)。 我可以找到的最接近的报价是在第17.5.1.2/2节: 但是,“除非我错误地认为该段落仅适用于图书馆部分(即第18至30条和附件D)。 因此问题: ..
发布时间:2016-10-13 11:28:50 C/C++开发

未定义行为和已形成,无诊断消息之间的区别

C ++标准提供了惊人的定义 1 行为,这意味着微妙的差异或多或少相同。阅读此答案,我注意到了“该程序不正常,无需诊断”的说法。 实施定义不同于未指定行为,前一种情况的实施必须清楚地记录它在做(在后一种情况下,它不需要),两者都是良好形成的 。 未定义的行为与未指定的行为有所不同,因为程序是错误的(1.3.13)。 否则,所有标准都没有假设或关于实现将做什么的要求。 除了1.4 / ..
发布时间:2016-10-13 11:24:29 C/C++开发

可观察的行为和未定义的行为 - 如果我不调用析构函数会发生什么?

注意:我已经看过类似的问题,但没有一个答案足够精确,所以我自己问。 这是一个非常nitpicky“语言律师”的问题;我正在寻找一个权威的答案。 C ++标准说: 程序可以通过重用对象占用的存储器或通过显式调用具有非平凡析构函数的类类型的对象的析构函数来结束任何对象的生命周期。对于具有非平凡析构函数的类类型的对象,程序不需要在对象占用的存储被重新使用或释放​​之前明确地调用析构函数 ..
发布时间:2016-10-13 11:21:30 C/C++开发

是stl向量并发读取线程安全吗?

我正在开发一个应用程序,其中大量的线程需要迭代的字符串值的集合,并尝试匹配它自己的数据与列表中的数据。 我正在寻找以下用例: 向量被初始化为std :: string类型的几个元素。 (让我们说对象名是strList)。 所有线程将迭代strList,以查看它的值是否与strlist的至少一个元素匹配。 没有线程会尝试修改strList,它将被严格用作只读对象。 并发读是线程 ..
发布时间:2016-10-13 11:17:24 C/C++开发

是否增加一个明确定义的空指针?

有很多未定义/未指定行为的例子,当做指针算术 - 指针必须指向同一数组(或一个超过结束),或内部同一对象,限制,当你可以做比较/操作以上等等。 以下操作是否明确定义? int * p = 0; p ++; 解决方案 §5.2.6/ 1: 通过向 1 添加操作数对象的值来修改操作数对象的值,除非对象是类型 bool [..] ..
发布时间:2016-10-13 11:15:51 C/C++开发

为什么模板模板参数不允许'typename'在参数列表后面

模板模板类型名? 在模板中使用模板模板语法时类T> ,需要使用关键字 class ,因为使用 typename 以下行的错误: 错误:模板模板参数在参数列表后需要'class' 其他地方的关键字 typename 和 class 可以在声明模板参数的基本情况下互换。 您可以认为使用模板模板时的要求是一个提示,传递类类型,但并不总是这 ..
发布时间:2016-10-13 11:08:50 C/C++开发

is std :: vector< T>一个'用户定义的类型'?

在当前草案的17.6.4.2.1 / 1和17.6.4.2.1 / 2中标准限制了用户在命名空间std 中注入的特殊化。 如果C ++ 程序在命名空间中添加了声明或定义,那么它的行为是未定义的 std 或 命名空间中的命名空间 std ,除非另有规定。程序可以将任何标准库模板的模板专用化 添加到命名空间 std 中,只要声明依赖于用户定义的类型 ,专业化满足原始模板的标 ..
发布时间:2016-10-13 11:03:52 C/C++开发

程序在3个主要的C ++编译器中编译不同。哪一个是正确的?

作为一个有趣的后续(不是很大的实际重要性,虽然)我的上一个问题: 为什么在声明变量时,C ++允许我们在括号中包围变量名? 我发现将括号中的声明与注入类名功能可能会导致关于编译器行为的令人惊讶的结果。 查看以下程序: #include struct B { }; struct C { C(){std :: cout ..
发布时间:2016-10-13 10:59:25 C/C++开发