language-lawyer相关内容

可以将具有未定义行为的分支假定为不可达,并作为死代码进行优化?

请考虑以下语句: *((char *)NULL)= 0; // undefined behavior 它清楚地调用未定义的行为。在给定程序中这样的语句的存在意味着整个程序是未定义的,或者一旦控制流命中这个语句,行为只会变得未定义? 以下程序如果用户从未输入数字 3 ? while(true){ int num = ReadNumberFromCons ..
发布时间:2016-10-13 10:54:19 C/C++开发

为什么f(i = -1,i = -1)未定义行为?

我在阅读关于违反评估次序的订单,他们给出一个令我困惑的例子。 / p> 1)如果对标量对象的副作用相对于同一标量对象上的另一个副作用未排序,那么行为是未定义的。 // snip f(i = -1,i = -1) // undefined behavior 在此上下文中, i 是一个标量对象,它显然意味着 算术类型.1),枚举类型,指针类 ..
发布时间:2016-10-13 10:51:07 C/C++开发

在C ++ 11中左移(<<)一个负整数未定义的行为?

是否向左移动一个否定 int 在C ++ 11中未定义的行为? 这里是从5.8: 2 / E1的值位为零填充。如果E1具有无符号类型, 结果的值为E1×2E2,比在结果类型中可表示的最大值 减1。否则,如果E1具有签名类型 和非负值,并且E1×2E2可以在结果 类型中表示,那么这是结果值; 令我困惑的部分是: $否则,如果E1具有有符号类型和非负值,并且E1×2E2 ..
发布时间:2016-10-13 10:41:50 C/C++开发

附加std :: vector到自身,未定义的行为?

这个问题使我不确定向量本身是否附加。所以问题是:下面的代码行是否符合我的期望,但它是否符合标准? vec.reserve size()* 2): vec.insert(vec.end(),vec.begin(),vec.end()); 以下(不含 reserve())工作,是否甚至标准符合? vec.insert(vec.end(),vec.begin(),v ..
发布时间:2016-10-13 10:41:08 C/C++开发

不评估应用sizeof的表达式是否合法,在C ++中解析sizeof中的空指针或无效指针?

首先,我看到了关于C99的这个问题,并且接受的答案参考操作数不是在C99标准草案中评估了字样。我不知道这个答案适用于C ++ 03。还有有关C ++的这个问题,它有一个接受的答案,引用了类似的措辞和在一些上下文中,未评估的操作数出现。未评估的操作数未评估。 我有此代码: int * ptr = 0; void * buffer = malloc(10 * sizeof(* ptr ..

调用std :: function< void(Args ...)>下标准?

所有报价均来自 N3797 。 4/3 [conv] 表达式 e 可以是 将 隐式转换为类型 T 如果且仅当声明为 T t = e; 是合格的, 是一些发明的临时变量 t 隐式转换为 void ,因为 void t = e 对所有表达式都是非法的 / code>。如果 e 是类型 void 的表达式,例如 void )。 因此,类型 void 的表达式不 ..
发布时间:2016-10-13 10:29:07 C/C++开发

我们可以应用没有明确引用从C ++标准的规范性引用的内容吗?

在C ++ 11标准( 最近草案is N3337 )section 1.2 规范参考说: 以下引用的文档对于本文档的 应用程序是不可或缺的。对于注日期的引用文件,只有引用的版本 适用。对于未注明日期的引用,最新版本的 引用文件(包括任何修订)适用。 关于如何应用参考。容易的情况是当C ++ 11显式地引用回一个引用,例如在 3.9.1 基本类型中,它说: / p> [... ..
发布时间:2016-10-13 10:22:47 C/C++开发

在其中C ++标准的版本“(i + = 10)+ = 10”有未定义的行为?

在C ++中,以下是否有未定义的行为: int i = 0; (i + = 10)+ = 10; 在我的回答 在C和C ++中+ =的结果是什么?这里的细微之处是,默认响应似乎是“是”,而正确的答案是“它取决于C ++标准的版本”。 如果它依赖于标准的版本,请解释UB在哪里和不在哪里。 解决方案 tl; dr :(i + = 10)+中执行的修改 ..
发布时间:2016-10-13 10:21:44 C/C++开发

为什么标准区分直接列表初始化和复制列表初始化?

我们知道 T v(x); 被称为直接初始化,而 T v = x; 被称为复制初始化,意味着它将从 x 构造一个临时 T / code>将被复制/移动到 v (这很可能被省略)。 对于列表初始化,标准区分两种形式,具体取决于上下文。 T v {x}; 被称为直接列表初始化 c $ c>被称为 copy-list-initialization : §8.5.4[dcl.init.list ..
发布时间:2016-10-13 10:11:39 C/C++开发

这个代码来自“C ++编程语言”第4版第36.3.6节有明确的行为?

在Bjarne Stroustrup的 C ++编程语言 第4版部分 36.3.6 类似STL的操作,以下代码用作链接: void f2() { std :: string s =“但我听说它工作,即使你不相信它”; s.replace(0,4,“”).replace(s.find(“even”),4,“only”) .replace(s.find(“do not”) ,6“,” ..

不使用EOF位作为流提取条件的真正原因是什么?

受我的上一个问题的启发 新的C ++程序员的一个常见错误是从文件中读取以下行: std: :ifstream file(“foo.txt”); std :: string line; while(!file.eof()){ 文件>>线; //使用行 执行操作 文件的最后一行被读取两次。这个问题(我之前提到的)的常见解释是: 提取将只设置E ..
发布时间:2016-10-13 09:57:27 C/C++开发