创建decltype的临时对象

Creating a temporary of decltype

本文关键字:临时对象 decltype 创建      更新时间:2023-10-16

我有一个对象的某种类型,例如,std::vector<int> v;
现在,假设我想验证v是否释放了它所有的内部内存。
在c++ 11 shrink_to_fit()方法之前,推荐/保证的方法是使用相同类型的空std::vector<>来实现swap()

但是,我不想指定对象的类型。我可以使用decltype来指定类型,所以我想这样写:

std::vector<int> v;
// use v....
v.swap(decltype(v)()); // Create a temporary of same type as v and swap with it.
                  ^^

但是,上面的代码不起作用。我似乎不能用空的actor创建decltype(v)类型的临时对象(在本例中)。

是否有其他语法来创建这样的临时文件?

问题是swap接受左值引用:您不能将临时引用传递给swap。相反,您应该将其转换为调用临时对象的swap成员:

decltype(v)().swap(v);

当然,c++ 11引入了shrink_to_fit()成员,这样交换技巧就不再需要了。

您不能将临时右值绑定到非const 左值引用,因此您不能将其作为参数传递给swap。但是,您可以在临时对象上调用成员函数,因此可以这样做:

decltype(v)().swap(v);

在c++ 11中,从临时的:

移开会更清楚。
v = decltype(v)();

或使用shrink_to_fit

v.clear();
v.shrink_to_fit();

(注意,如果你没有c++ 11,那么你就没有decltype,所以这个问题是没有意义的)。

你可以这样做(c++ 11):

v.clear();
v.shrink_to_fit();

或:

{
    decltype(v) tmp;
    v.swap(tmp);
}

vector::swap通过引用接受参数。所以这里不能用temporary

澄清一下,decltype(v)() 创建未命名临时文件的有效语法。
正如其他答案所解释的那样,错误的根源是swap()不能与decltype(v)()返回的临时变量一起工作。