我读到了FDIS(12.2p {4,5})中的这两段文字:
引用第一段: 有两种情况下,临时变量的销毁时间点与完整表达式的结束时间点不同。第一种情况是调用默认构造函数来初始化数组元素时。如果构造函数有一个或多个默认参数,则在构造下一个数组元素(如果有)之前,将顺序销毁创建于默认参数中的每个临时对象。
和
引用第二段: 第二种情况是将引用绑定到临时变量上。除非以下情况: [...]
- 通过函数调用(5.2.2)绑定到引用参数的临时变量将持续到包含该调用的完整表达式完成为止。
这两个情况似乎对于以下情况相互矛盾。
引用第一段: 有两种情况下,临时变量的销毁时间点与完整表达式的结束时间点不同。第一种情况是调用默认构造函数来初始化数组元素时。如果构造函数有一个或多个默认参数,则在构造下一个数组元素(如果有)之前,将顺序销毁创建于默认参数中的每个临时对象。
和
引用第二段: 第二种情况是将引用绑定到临时变量上。除非以下情况: [...]
- 通过函数调用(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{};
}
这会输出所需的 CDCD
吗?还是按照第二个上下文所需输出 CCDD
?GCC似乎遵循第二个上下文描述并输出 CCDD
。我有没有忽视重要的东西?
编辑:我认为这不需要C++0x。我的问题也会影响此 new
表达式:
new array(); /* CDCD or CCDD ?? */
但在这种情况下,GCC遵循第一个上下文,并输出CDCD
。
new array()
情况相关,因为它会打印出CDCD
? - rubenvb