c++ - C++11 中基于 for 的表达式模板和范围

标签 c++ c++11 expression-templates

据我了解,在 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/

相关文章:

c++ - 计算 View 投影矩阵

c++ - 如何在 C++ 中读取 Evolution 邮件管道?

c++ - 在映射中存储没有默认构造函数的不可复制对象 (C++11)

c++ - 为什么 std::string 不定义乘法或文字?

c++ - 表达式模板和求和符号

c++ - 如何防止 QStringBuilder 超出其初始化范围

c++ - 将 __m128i 值转换为 std::tuple

c++ - 如何将方法传递给 qsort?

c++ - 我可以禁用 std::vector 的复制构造函数吗?

java - 在java中传递泛型类类型