当通过子表达式创建数组时,其中的临时对象会发生什么?

问题描述

| 我正在阅读Fdis(12.2p {4,5})的这两段:   在两种情况下,临时变量在与完整表达式结束时不同的位置被销毁。第一个上下文是调用认构造函数初始化数组的元素时。如果构造函数具有一个或多个认参数,则在构造下一个数组元素(如果有)之前,将对在认参数中创建的每个临时变量的销毁顺序进行排序。 和   第二种情况是引用绑定到临时项时。引用所绑定的临时对象或引用所绑定的子对象的完整对象的临时对象在引用的生存期内一直存在,但以下情况除外:   [...]         在函数调用(5.2.2)中,绑定到参考参数的临时绑定一直持续到包含该调用的完整表达式完成。    对于以下情况,这两个两个似乎矛盾
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{};
}
输出是第一个上下文要求的“ 1”还是第二个上下文要求的输出“ 2”? GCC似乎遵循第二个上下文描述,并输出
CCDD
我有没有忽略重要的事情? 编辑:我不认为它需要C ++ 0x。这个ѭ4affected表达式也受到我的问题的影响:
new array(); /* CDCD or CCDD ?? */
但是,在这种情况下,GCC遵循第一个上下文,并输出
CDCD
。     

解决方法

        我认为没有矛盾。 5.2.2清楚地说明了什么是函数调用。函数调用是后缀表达式,后跟括号 可能是空的 逗号分隔的表达式列表 构成了 功能。 在您的程序中的任何地方似乎都没有对ѭ7call的函数调用,因此我看不到第二篇文章如何应用。 编辑以上可能是不正确的,给定1.9p10等。