rvalue或lvalue(const)引用参数

Ori*_*ent 5 c++ sfinae c++11 universal-reference

我想int通过r-或l-值(const)引用将参数(某些具体类型,例如)传递给成员函数.我的解决方案是:

#include <type_traits>
#include <utility>

struct F
{
    using desired_parameter_type = int;

    template< typename X, typename = typename std::enable_if< std::is_same< typename std::decay< X >::type, desired_parameter_type >::value >::type >
    void operator () (X && x) const
    {
        // or even static_assert(std::is_same< typename std::decay< X >::type, desired_parameter_type >::value, "");
        std::forward< X >(x); // something useful
    }
};
Run Code Online (Sandbox Code Playgroud)

另一个例子是http://pastebin.com/9kgHmsVC.

但它太冗长了.如何以更简单的方式做到这一点?

也许我应该使用叠加std::remove_referencestd::remove_const不是std::decay,但这里只是简化.

And*_*owl 4

如果我正确理解您的问题,您希望有一个函数,其参数是右值引用(如果提供了右值)或左值引用const(如果提供了左值)。

但这个函数会做什么呢?好吧,由于它必须能够处理这两种情况,包括提供左值的情况,因此它不能修改其输入(至少不能修改绑定到参数的输入) - 如果这样做,它将违反引用x的语义const

但话又说回来,如果它不能改变参数的状态,就没有理由允许右值引用:而应该始终x是左值引用。const左值引用const可以绑定到右值,因此您将被允许传递右值和左值。

如果函数的语义根据传递的内容而不同,那么我会说编写两个这样的函数更有意义:一个采用右值引用,另一个采用对 的左值引用const