gpt4 book ai didi

c++ - 当一个数组由子表达式创建时,其中的临时变量会发生什么?

转载 作者:IT老高 更新时间:2023-10-28 22:05:39 25 4
gpt4 key购买 nike

我正在阅读 FDIS (12.2p{4,5}) 的这两段:

There are two contexts in which temporaries are destroyed at a different point than the end of the full-expression. The first context is when a default constructor is called to initialize an element of an array. If the constructor has one or more default arguments, the destruction of every temporary created in a default argument is sequenced before the construction of the next array element, if any.

The second context is when a reference is bound to a temporary. The temporary to which the reference is bound or the temporary that is the complete object of a subobject to which the reference is bound persists for the lifetime of the reference except: [...]

  • A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full-expression containing the call.

这两个对于下面的情况似乎是矛盾的

struct A {
A() { std::cout << "C" << std::endl; }
~A() { std::cout << "D" << std::endl; }
};

struct B {
B(A const& a = A()) { }
};

typedef B array[2];

int main() {
array{};
}

会按照第一个上下文的要求输出 CDCD,还是按照第二个上下文的要求输出 CCDD? GCC 似乎遵循第二个上下文描述并输出 CCDD。我是否忽略了一些重要的事情?


编辑:我认为它不需要 C++0x。这个 new-表达式也受到我的问题的影响:

new array(); /* CDCD or CCDD ?? */

不过,在这种情况下,GCC 会遵循第一个上下文,并输出 CDCD

最佳答案

我不认为有矛盾。

5.2.2 清楚地说明了函数调用是什么。函数调用是后缀表达式后跟括号包含一个可能为空的,逗号分隔的表达式列表这构成了论据功能。

您的程序中的任何地方似乎都没有对 B::B(A const&) 的函数调用,所以我看不出第二段是如何应用的。

鉴于 1.9p10 等,编辑上述内容可能不正确。

关于c++ - 当一个数组由子表达式创建时,其中的临时变量会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6315670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com