我很惊讶类型衰减在 SO 或其他地方没有得到很好的解释,也许我没有使用正确的术语进行搜索,或者也许我没有正确理解整个事情。我的问题是:它是什么,它是如何(为什么)到达那里的,它的规则是什么?
如果你想知道我为什么问,下面是我的哭泣型腐烂故事(not不过,问题的主题):
我最近正在努力处理一些简单的模板,我想做这样的事情:
template <class FunObj>
double DoStuff(FunObj fob) // note that this returns double, not FunObj, as e.g. std::for_each() does
{ /* ... */ }
struct MyFunObj {
mutable size_t num_invoked; // collect usage statistics
MyFunObj()
:num_invoked(0)
{}
bool operator ()(double some_arg) const
{
++ num_invoked;
return sin(some_arg) < .5;
}
};
这一切都很好,有一个模板函数需要一个函数对象,还有一个函数对象。该函数被设计为不返回函数对象的状态(就像类似的函数经常做的那样;它返回一些复杂计算的结果),所以我想我应该将它专门用于参考到对象。但类型衰减会妨碍(或者至少这是我的理解):
MyFunObj fob;
DoStuff(fob); // passed by value, usage statistics are lost (no surprise here)
MyFunObj &ref = fob;
DoStuff(ref); // MyFunObj& decays to MyFunObj, usage statistics are lost
DoStuff(static_cast<MyFunObj&>(fob)); // again, hampered by type decay
我知道如何解决这个问题,所以请不要回复如何解决。我只对类型衰减感兴趣,这只是作为我的问题的动机/说明性示例。如果你愿意,你可以发表一些对我使用的仇恨mutable
.