2

当临时对象绑定到类的实例时,我发现下面的 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 标准,这种行为是否正确?请指出标准的相关部分。

注意: AB,以及它们绑定的临时对象在表达式中实例化。在表达式结束时,它们连同它们绑定的临时对象一起被销毁,这就是为什么它们的生命周期应该与临时对象的生命周期相同。

编辑:标准的这一部分能否解释两个初始化之间的差异:

— 否则,如果 T 是引用类型,则 T 引用的类型的纯右值临时是列表初始化的,并且引用绑定到该临时。[注意:像往常一样,如果引用类型是对非常量类型的左值引用,则绑定将失败并且程序格式错误。——尾注]

4

2 回答 2

4

这样的行为是不正确的。请参阅 8.5.4p3 第四条最后一个项目符号。一段时间以来,预标准草案就是这种情况,但在 C++11 中并非如此。

看起来你很困惑:在任何情况下都不应该创建一个临时的。两种情况都应该用另一个引用初始化一个引用。只有在第二种情况下,一些准标准草案说应该创建一个临时的并绑定到成员引用,而不是直接初始化引用。

(请参阅此列表中的第 27 号)。

于 2013-06-29T17:22:28.473 回答
2

I find, for the first sample, a bound temporary object persists for the life-time of an instance of A, but this is not the case for an instance of B. Is such behavior correct according to the C++11 standard?

The behaviour of B is correct. But the behaviour of A is wrong in that the life-time of the temporary should not persist till the life-time of object of A (or the life-time of B in case of B).

But as a sidenote, since you're binding a temporary to the member of B, be aware! The temporary doesn't exist when the constructor returns, which means what the member refers to, doesn't exist!

于 2013-06-29T17:23:21.237 回答