我的问题很简单,但我想很难回答。
在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
是完全不正确的。