当临时对象绑定到类的实例时,我发现下面的 2 个示例使用 g++-4.8.1 得到了不同的行为:
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 引用的类型的纯右值临时是列表初始化的,并且引用绑定到该临时。[注意:像往常一样,如果引用类型是对非常量类型的左值引用,则绑定将失败并且程序格式错误。——尾注]