我有某种类型的对象,例如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.
^^
但是,上面的代码不起作用。我似乎无法创建一个带有空ctor的decltype(v)
类型的临时(在这种情况下)。
是否还有其他语法来创建这样的临时语句?
答案 0 :(得分:10)
问题是swap
采用左值引用:您无法将临时值传递给swap
。相反,你应该切换它,以便你打电话给临时的swap
成员:
decltype(v)().swap(v);
当然C ++ 11引入了shrink_to_fit()
成员,因此不再需要交换技巧。
答案 1 :(得分:5)
您无法将临时 rvalue 绑定到非const 左值引用,因此您无法将其作为参数传递给{{ 1}}。但是,您可以在临时调用成员函数,因此这将起作用:
swap
在C ++ 11中,从临时代码中移除会更清楚:
decltype(v)().swap(v);
或使用v = decltype(v)();
shrink_to_fit
(请注意,如果你没有C ++ 11,那么你就没有v.clear();
v.shrink_to_fit();
,所以这个问题没有实际意义。)
答案 2 :(得分:3)
你可以做(C ++ 11):
v.clear();
v.shrink_to_fit();
或:
{
decltype(v) tmp;
v.swap(tmp);
}
vector::swap
通过引用引用参数。所以暂时不能在这里使用。
答案 3 :(得分:1)
为了澄清,decltype(v)()
是创建未命名临时文件的有效语法。
正如其他答案所解释的那样,错误的来源是swap()
不适用于decltype(v)()
返回的临时错误。