创建decltype的临时对象
Creating a temporary of decltype
我有一个对象的某种类型,例如,std::vector<int> v;
现在,假设我想验证v
是否释放了它所有的内部内存。
在c++ 11 shrink_to_fit()
方法之前,推荐/保证的方法是使用相同类型的空std::vector<>
来实现swap()
。
但是,我不想指定对象的类型。我可以使用decltype
来指定类型,所以我想这样写:
std::vector<int> v;
// use v....
v.swap(decltype(v)()); // Create a temporary of same type as v and swap with it.
^^
但是,上面的代码不起作用。我似乎不能用空的actor创建decltype(v)
类型的临时对象(在本例中)。
是否有其他语法来创建这样的临时文件?
问题是swap
接受左值引用:您不能将临时引用传递给swap
。相反,您应该将其转换为调用临时对象的swap
成员:
decltype(v)().swap(v);
当然,c++ 11引入了shrink_to_fit()
成员,这样交换技巧就不再需要了。
您不能将临时右值绑定到非const 左值引用,因此您不能将其作为参数传递给swap
。但是,您可以在临时对象上调用成员函数,因此可以这样做:
decltype(v)().swap(v);
在c++ 11中,从临时的:
移开会更清楚。v = decltype(v)();
或使用shrink_to_fit
v.clear();
v.shrink_to_fit();
(注意,如果你没有c++ 11,那么你就没有decltype
,所以这个问题是没有意义的)。
你可以这样做(c++ 11):
v.clear();
v.shrink_to_fit();
或:
{
decltype(v) tmp;
v.swap(tmp);
}
vector::swap
通过引用接受参数。所以这里不能用temporary
澄清一下,decltype(v)()
是创建未命名临时文件的有效语法。
正如其他答案所解释的那样,错误的根源是swap()
不能与decltype(v)()
返回的临时变量一起工作。
相关文章:
- 在不复制临时对象的情况下延长其生存期
- 为什么当我们有常量引用时创建临时对象?
- 程序如何'remember'临时对象?
- 返回对临时对象的引用
- 防止临时对象文件访问 MSVC 中的磁盘
- 是否可以在C++中移动临时对象的属性?
- 通过引用传递临时对象
- 临时C++对象是否为左值?
- 临时对象:术语澄清
- 存储对(可能)临时对象的引用是否合法,只要引用不比对象存活?
- 临时对象有身份吗?
- 临时对象上的运算符重载
- 如何在没有 std::move 的情况下移动临时对象
- 临时对象在C++中是不可避免的吗?
- 编译错误:临时对象构造函数中缺少参数
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 我试图创建临时对象的方式有错误吗
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 创建decltype的临时对象