【发布时间】:2017-08-20 05:54:44
【问题描述】:
#include <type_traits>
#define FORWARD(arg)\
std::forward<decltype(arg)>(arg)
template<typename... Args>
constexpr bool AndL(Args&&... args)
{
return (... && FORWARD(args));
}
template<typename... Args>
constexpr bool AndR(Args&&... args)
{
return (FORWARD(args) && ...);
}
int main()
{
bool* pb = nullptr;
false && (*pb = true); // ok at runtime.
AndL(false, (*pb = true)); // error at runtime!
AndR(false, (*pb = true)); // error at runtime!
}
传统的&&操作符支持短路求值,所以false && (*pb = true)在运行时是可以的,但是下面两种情况不行。
如何在fold expressions 中也提供短路评估?
【问题讨论】:
-
这里的问题根本不是折叠表达式。试试
constexpr bool AND(bool a, bool b) { return a && b; }。问题是在调用函数之前必须评估所有参数,并且传入的是它们的 result。 -
你永远不会新
pb,所有*pb = true都是未定义的行为。 -
运行时评估的原因是因为
*pb = true本身不是constexpr。 -
@appleapple 这就是重点:在取消引用之前使用短路检查
nullptr。 -
@Quentin 谢谢,这对我来说不是那么明显。 OP似乎因此而感到困惑。如果 OP 尝试使用其他不依赖于未定义行为的表达式。这样做可能会更清楚。
标签: c++ standards c++17 short-circuiting fold-expression