【问题标题】:Creating a temporary of decltype创建一个临时的 decltype
【发布时间】:2014-03-19 15:42:02
【问题描述】:

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

有没有其他的语法来创建这样一个临时的?

【问题讨论】:

  • 推荐的方法是shrink_to_fit。
  • @chris:啊!真的。我忘记了这个方法。谢谢,我会重新编辑,但我的问题仍然存在。

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


【解决方案1】:

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

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

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

【讨论】:

  • 有时我真的认为应该有一个lvalue_cast 来从临时创建左值(定义为模板非常简单,但它不能用裸static_cast 完成)。它具有所有必要的属性,规则只是防止常见错误的保障。
【解决方案2】:

您不能将临时 rvalue 绑定到非 const lvalue 引用,因此不能将其作为参数传递给 swap。但是,您可以临时调用成员函数,这样就可以了:

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

在 C++11 中,从临时转移会更清晰:

v = decltype(v)();

或使用shrink_to_fit

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

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

【讨论】:

    【解决方案3】:

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

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

    或:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-30
        • 2013-10-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        相关资源
        最近更新 更多