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

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

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

template <class T>
struct has_side_effects;

会怎么样?

我可以接受返回假阳性的特征(比如说一个函数没有副作用,但不能接受),但是不能返回一个假阴性的特征(比如说一个函数可以同时没有副作用)。

例如,我想要特征:
auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;

返回false

最佳答案

如前所述,template<class T> using has_side_effects = std::true_type;解决了您的大部分问题。只需声明所有东西都有副作用,然后发货即可。误报,但没有误报!

通常,无法计算在图灵完备系统中编码的算法的非平凡属性。这样做等同于停止问题。因此,该问题通常无法解决。

在特定情况下,C++对算法的内容基本上提供零反射。充其量它可以在算法的接口(interface)上提供一些反射,但是算法/功能的接口(interface)不包含有关算法纯度的信息。

您可以获得的最接近的结果是“可以在constexpr上下文中调用它”。

在具体情况下:

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{})有副作用。传递false时让它返回comparator是完全不正确的。

10-02 07:31