5

我有某种类型的对象,例如,std::vector<int> v;
现在,比如说,我想验证它是否v释放了它的所有内部内存。
在 C++11shrink_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.
                  ^^

但是,上面的代码不起作用。我似乎无法decltype(v)用空的 ctor 创建一个临时类型(在这种情况下)。

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

4

4 回答 4

10

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

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

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

于 2014-03-19T15:48:54.210 回答
5

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

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

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

v = decltype(v)();

或使用shrink_to_fit

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

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

于 2014-03-19T15:49:33.427 回答
3

你可以做(​​C++11):

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

或者 :

{
    decltype(v) tmp;

    v.swap(tmp);
}

vector::swap通过引用接受参数。所以临时不能在这里使用。

于 2014-03-19T15:47:50.617 回答
1

澄清一下,decltype(v)() 创建未命名临时文件的有效语法。
正如其他答案所解释的那样,错误的根源在于swap()它不适用于decltype(v)().

于 2014-03-19T18:26:18.100 回答