【发布时间】:2023-03-21 10:40:01
【问题描述】:
在回答了一些问题后,我今天构建了这个实验
struct A {
bool &b;
A(bool &b):b(b) { }
~A() { std::cout << b; }
bool yield() { return true; }
};
bool b = A(b).yield();
int main() { }
b 在通过动态初始化将其设置为true 之前具有值false(由零初始化产生)。如果临时在b 初始化完成之前被销毁,我们将打印false,否则打印true。
规范说临时在完整表达式结束时被销毁。这似乎与b 的初始化无关。所以我想知道
- 规范是否允许实现在不同的运行中同时打印
false和true?
Clang 为上述内容打印 false,而 GCC 打印 true。这让我很困惑。我是否错过了一些定义订单的规范文本?
【问题讨论】:
-
澄清一下,
b有静态存储? -
@GMan 是的。我很抱歉这种不清楚。我将添加一个
main函数。 -
我看到了这个问题,想起了我们在这个问题上的对话,并想“嗯,我会把这个链接发给 litb,看看他对这个问题有什么看法”。没关系,嗯? :)
-
在
main中的赋值语句的情况下,Clang 会打印什么? -
有趣的是,
Johannes Schaub - litb得到这么多Upvotes的问题,但答案却不多。哈哈..
标签: c++ initialization language-lawyer temporary-objects order-of-execution