【发布时间】:2012-03-19 13:16:51
【问题描述】:
据我了解,在 C++11 中,表达式模板会在基于范围的 for 上中断,因为 for (auto x : expr) 中有一个隐含的 auto&& __range = expr,这将导致悬空引用。
有没有办法创建表达式模板类,以便它们在基于范围的 for 中正常运行,或者至少引发编译错误?
基本上,我想防止表达式模板正确编译但由于悬空引用而在运行时失败的可能性。我不介意在基于范围的 for 中使用表达式模板之前必须将它们包装在某些东西中,只要在用户忘记包装表达式模板时不会出现静默运行时错误。
【问题讨论】:
-
基于范围的
for循环中的auto&&可能真的很容易被人打到自己的脚上——我还没有真正理解到底是什么范围类型受到影响,以及为什么(对非常量的左值引用:危险,非引用:没有问题,???)。 -
@Philipp:没有“范围类型”之类的东西。有简单的类型符合范围“概念”。具体来说,有一对
begin/end覆盖返回输入迭代器。 -
我想答案是确保表达式模板不符合“概念”范围,即它们没有
begin和end。 -
@NicolBolas:对不起,草率的语言,我在考虑表达式类别分类,而不是范围概念。可能答案只是“对临时人员的引用可能会变得悬而未决”。 @Clinton:这在这种情况下会有所帮助,但对于
string("a") += string("b")之类的例子则无济于事。 -
您好,目前尚不清楚您的目标是什么。您想提供一个基于表达式模板的库并能够在 foreach 循环中使用它吗?还是您有一个库并且不希望它与 foreach 一起编译?还是您希望它编译并且没有悬空引用问题?
标签: c++ c++11 expression-templates