【发布时间】:2016-05-02 03:58:36
【问题描述】:
我的问题问起来很简单,但我想,很难回答。
在 C++14 中,有没有办法测试可调用(函数、函数成员、lambda 函数、std::function 等)是否有副作用?
如果是这样,类型特征将如何:
template <class T>
struct has_side_effects;
会喜欢吗?
我可以接受会返回误报的特征(说函数有副作用而它没有),但不能接受会返回误报的特征(说函数没有副作用,而它确实)。
例如,我想要 trait:
auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;
返回false。
【问题讨论】:
-
这是不可能的,除非函数是 constexpr
-
静态分析器可能会有所帮助......但这似乎不是一项简单的任务。
-
@DieterLücking
constexpr也不可能,除非由实施者保证。constexpr函数允许有导致副作用的分支。 -
这似乎可以减少到停机问题,不是吗?
-
@erip:如果不允许误报,它只会减少到停止问题。否则,正如 Yakk 所说,有一个简单的算法只是说“一切都有副作用”:-)
标签: c++ function c++14 template-meta-programming side-effects