输入特征以检测可调用对象是否有副作用?

Type traits to detect if a callable has side effects?

我的问题问起来很简单,但我想,很难回答。

在 C++14 中,有没有办法测试可调用对象(函数、函数成员、lambda 函数、std::function 等...)是否有副作用?

如果是这样,a 类型特征如何:

template <class T>
struct has_side_effects;

会怎样?

我可以接受 return 假阳性的特征(说函数有副作用而实际上没有),但不接受 return 假阴性的特征(表示函数在执行时没有副作用)。

例如,我想要特征:

auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;

到returnfalse.

如前所述,template<class T> using has_side_effects = std::true_type; 可以解决您的大部分问题。简单地声明一切都有副作用,然后发布。误报,但没有漏报!

一般来说,无法计算在 Turing-complete 系统中编码的算法的 non-trivial 属性。这样做等同于停机问题。所以这个问题不能一概而论

在特定情况下,C++ 对算法内容的反映基本上为零。充其量它提供了对算法 接口 的一些反映,但是 algorithm/function 的接口不包含有关算法纯度的信息。

最接近的是 "can it be invoked within a constexpr context"。

具体案例:

auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;

结果必须是 true,因为:

struct evil {
  static int count() { static int r = 0; return ++r; }
  friend bool operator<( evil lhs, evil rhs ) { count(); return false; }
};

然后comparator(evil{}, evil{})有副作用。在通过 comparator 时使用 return false 是完全不正确的。