我的实际用例需要更多参数,但它简化为:
template< typename Arg1 >
bool algorithm( Arg1&& p1, **p2 here** );
很明显,Arg1 将以某种方式崩溃并可能成为某种参考。p1 也是算法的输出,因此如果调用者选择传入左值,函数将返回并修改原始参数以反映它停止的位置。
但是 p2 是同一类型,但永远不会被修改。所以实际上我想在那里放一个“const”承诺以确保正确性。显然,如果 Arg1 推断为参考,我不能将 const 添加到它。
所以我的解决方案是这样的:
template< class T >
struct make_const_ref
{
typedef typename std::add_reference< typename std::add_const< typename std::remove_reference< T >::type >::type >::type type;
};
template< typename Arg1 >
bool algorithm( Arg1&& p1, typename make_const_ref<Arg1>::type p2 );
它经历了一堆愚蠢的阴谋来删除一些限定符,然后重新粘贴 const& 。
所以我的问题是:
1)这是最好的方法吗?
2) 是否存在这将失败的上下文?现在对我来说似乎还不错。