相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

什么时候初始化器暂时销毁?

在回答了一些问题之后,我今天构建了这个实验

struct A { 
  bool &b; 
  A(bool &b):b(b) { } 
  ~A() { std::cout << b; }  
  bool yield() { return true; } 
}; 

bool b = A(b).yield();

int main() { }
Run Code Online (Sandbox Code Playgroud)

bfalsetrue通过动态初始化将其设置为有值之前(由初始化为零).如果临时在b完成初始化之前被销毁,我们将打印false,否则true.

该规范说明临时在完整表达结束时被销毁.这似乎没有与初始化一起订购b.所以我想知道

  • 规范是否允许实现同时打印falsetrue不同的运行?

false用于上述的Clang打印,而GCC打印true.这让我很困惑.我是否错过了定义订单的规范文本?

c++ initialization language-lawyer temporary-objects order-of-execution

17
推荐指数
1
解决办法
597
查看次数