创建一个临时的decltype

Adi*_*vit 5 c++ decltype temporary-objects c++11

我有一个类型的对象,例如,std::vector<int> v;
现在,比方说,我想验证v释放所有内部内存.
在C++ 11 shrink_to_fit()方法之前,推荐/保证的方法是swap()使用std::vector<>相同类型的空.

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

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

但是,上面的代码不起作用.我似乎无法创建一个decltype(v)带有空ctor 的临时类型(在本例中).

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

bam*_*s53 10

问题是swap采用左值引用:您不能将临时值传递给swap.相反,你应该切换它,以便你调用临时swap成员:

decltype(v)().swap(v);
Run Code Online (Sandbox Code Playgroud)

当然,C++ 11引入了shrink_to_fit()成员,因此不再需要交换技巧.


Mik*_*our 5

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

decltype(v)().swap(v);
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,从临时移动会更清楚:

v = decltype(v)();
Run Code Online (Sandbox Code Playgroud)

或使用 shrink_to_fit

v.clear();
v.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

(注意,如果你没有C++ 11,那么你没有decltype,所以这个问题没有实际意义).