c++ - C++11:没有复制构造函数的自定义基于范围的循环
问题描述
我想要一个自定义的基于范围的循环,但没有复制构造函数。似乎在某些时候有一个副本,但我不明白为什么。
这是我想运行的示例: http: //cpp.sh/63pa6
class Range
{
public:
Range( int begin, int end )
: iter_( begin ),
last_( end )
{
}
Range(Range&&) = default;
Range& operator=(Range&&) = default;
Range(const Range&) = delete;
bool operator!=( const Range & /*unused*/ ) const
{
return iter_ != last_;
}
void operator++()
{
++iter_;
}
const Range &begin() const
{
return *this;
}
const Range &end() const
{
return *this;
}
int operator*() const
{
return iter_;
}
private:
int iter_;
int last_;
};
此代码无法编译:
int main()
{
for( auto i : Range( 2, 8 ) )
{
std::cout << i << std::endl;
}
}
编译错误:error: use of deleted function 'Range::Range(const Range&)'
解决方案
基于范围的 for 循环产生以下代码:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
如您所见,这会创建两个副本,__begin
并且__end
.
推荐阅读
- python - pandas 在重新格式化单元格时保留样式 - 无需将字符串重新解析为数字
- javascript - 有没有办法从 URL 中获取现有的子目录和文件?
- javascript - python selenium set value of textarea with javascript 不起作用
- javascript - 仅在某些情况下重定向
- python-3.x - 多窗口应用
- asp.net - 从 URL 查询字符串传递十六进制字符串在 ASP MVC 中不起作用
- swift - 关闭模式后如何连续运行另一个进程
- php - Dompdf 在 cellmap 中找不到错误帧
- android - 将 ByteArrayOutputStream 作为文件写入 data/data/packagename/files
- pandas - 从其他 2 个表创建一个新表