据我了解,在 C++11 中,表达式模板将在基于范围的 for 上中断,因为 for (auto x : expr)
具有隐式 auto&& __range = expr
在其中,这将导致悬空引用。
有没有一种方法可以创建表达式模板类,以便它们要么在基于范围的 for 下正确运行,要么至少抛出一个编译错误?
基本上,我想防止表达式模板可以正确编译但由于悬挂引用而在运行时失败的可能性。我不介意在基于范围的 for 中使用它们之前必须将表达式模板包装在某些东西中,只要在用户忘记包装表达式模板时不会出现静默运行时错误。
最佳答案
通常您对此无能为力。如果您给出一个表达式作为范围,它必须解析为在 for
语句初始化后有效的内容。并且无法在编译时检测到任何特定类型是由 auto
推导出来的。
让你的表达系统更基于移动会更好,这样它就不必保存引用。使用 auto
会产生比尝试存储对可能死掉的东西的引用更安全的结果。如果不可移动类型的复制给您带来麻烦,那就忍受吧。
关于c++ - C++11 中基于 for 的表达式模板和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9509530/