创建一个临时的decltype

时间:2014-03-19 15:42:03

标签: c++ c++11 decltype temporary-objects

我有某种类型的对象,例如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)类型的临时(在这种情况下)。

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

4 个答案:

答案 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)()返回的临时错误。