【发布时间】:2013-06-29 17:20:26
【问题描述】:
当临时对象绑定到类的实例时,我发现下面使用 g++-4.8.1 的 2 个示例会出现不同的行为:
template <class T>
struct A
{
A(T const& a) : b(a) { }
T const& b;
};
和
template <class T>
struct B
{
B(T const& a) : b{a} { }
T const& b;
}
我发现,对于第一个示例,绑定的临时对象在 A 的实例的生命周期内持续存在,但对于 B 的实例而言并非如此。根据 C++11,这种行为是否正确标准?请指出标准的相关部分。
注意:
A 和 B,以及它们绑定的临时对象在表达式中实例化。在表达式结束时,它们连同它们绑定的临时对象一起被销毁,这就是为什么它们的生命周期应该与临时对象的生命周期相同。
编辑:这部分标准能否解释两个初始化之间的差异:
—否则,如果 T 是引用类型,则 T 引用的类型的纯右值临时是列表初始化的, 并且引用绑定到该临时文件。 [注:和往常一样,绑定会失败,程序 如果引用类型是对非常量类型的左值引用,则格式错误。 ——尾注]
【问题讨论】:
-
您能否提供一个完整的例子?
-
完整的例子是一个表达式模板类,会很长。用 ( ) 替换 { } 使表达式模板库工作。
-
@JoachimPileborg Example at ideone 证明 g++-4.7.2 为
B创建了一个临时对象。