如何解决当通过子表达式创建数组时,其中的临时对象会发生什么?
| 我正在阅读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等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。