不对 value_or() 进行惰性求值的用例是什么?

m69*_*g'' 6 c++ stl lazy-evaluation c++17 stdoptional

foo.value_or(bar())我在代码中使用时遇到了麻烦,因为我不希望当可选变量有值bar()时调用该函数。foo我发现这个问题解释了value_or()不使用惰性求值。

现在我想知道为什么会这样,惰性求值一直是 C 和 C++ 中条件语句的标准方面。我发现这非常违反直觉,我认为我不是第一个也不会是最后一个被它绊倒的人。由于存在要求了解设计者想法的风险std::optional,是否有一个用例可以解释为什么惰性评估在这里不是一个好主意?

asc*_*ler 9

不可能设计一个执行惰性求值的函数。如果函数调用本身被求值,则函数参数总是被求值。唯一可以短路或以惰性方式求值的是内置的&&and||?:运算符。

其他相关评论:

一些标准库函数或特性执行的操作不可能在可移植代码中实现,因此它们需要一些编译器“魔法”。但他们试图限制此类事情。

即使是重载的运算符函数operator&&operator||仍然必须评估其操作数,因此重载这些操作数时需要注意:它们永远不会像内置版本一样运行。

尽管value_or函数本身不能推迟对其参数的求值,但您可以使用一些技巧来传递惰性占位符,该占位符仅在实际需要时才进行计算。