当临时对象绑定(bind)到一个类的实例时,我发现以下两种使用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;
}

我发现,对于第一个示例,绑定(bind)的临时对象在A实例的生存期内一直存在,但是对于B实例却并非如此。根据C++ 11标准,这种行为是否正确?请指向标准的相关部分。

注意:AB以及它们绑定(bind)的临时对象在表达式中实例化。在表达式的末尾,它们以及与它们绑定(bind)的临时对象一起被销毁,这就是为什么它们的生存期应与临时生存期相同的原因。

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

最佳答案

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

似乎您很困惑:在任何情况下都不应创建临时文件。两种情况都应使用另一个引用来初始化一个引用。仅在第二种情况下,一些标准前草案表示应创建临时文件并将其绑定(bind)到成员引用,而不是直接初始化引用。

(请参阅this list中的数字27)。

关于c++ - 对临时对象的const引用的列表初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17382796/

10-15 00:02