c++ - 防止将临时变量作为 const 引用传递的方法,该方法比删除 r 值重载更好地缩放

标签 c++ pass-by-reference rvalue-reference

当一个人想要阻止某人传递一个临时值作为 const 引用时,可以删除右值重载:

class Foo
{
public:

    Foo(const Bar& bar) : mBar(&bar) {} 
    Foo(const Bar&&) = delete;

private:

    const Bar* mBar;
};

但是,当存在多个此类参数时,此方法无法很好地扩展。它需要删除所有可能的组合才能有效:

Foo(const Bar&&, const Baz&, const Qux&) = delete;
Foo(const Bar&, const Baz&&, const Qux&) = delete; 
Foo(const Bar&, const Baz&, const Qux&&) = delete;
Foo(const Bar&&, const Baz&&, const Qux&) = delete;
//And every other combination...

有比这更好的方法吗?

最佳答案

也许是这样的?它非常清楚地表明您也不需要右值。

struct Foo{};
template <typename T>
struct NoRvalue {
    T t;
    NoRvalue(T & t);
    NoRvalue(T&& t) = delete;
};

void call_me(NoRvalue<Foo> a, NoRvalue<Foo> b);
void call_me2(Foo const & a, Foo const & b);

int main() {
    Foo f;
    call_me2(f, Foo());
    call_me(f, Foo()); // fails
}

直播:https://godbolt.org/z/LT9iSw

关于c++ - 防止将临时变量作为 const 引用传递的方法,该方法比删除 r 值重载更好地缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752947/

相关文章:

c++ - 按值和按引用传递函数指针的区别

operator-overloading - C++0x T operator+(const T&, T&&) 模式,还需要移动吗?

c++ - 函数模板中的参数推导

c++ 除以 0

iphone - 当我通过引用传递 CoreData 托管对象变量时,为什么我的原始变量没有改变?

javascript - 在另一个对象中引用对象javascript

c++ - 为什么 std::move() 没有 _Remove_reference 就不能工作?

c++ - 为什么我不能从一对中返回一个 unique_ptr?

c++ - 结构错误 "uninitialized reference member"

c++ - 跨进程互斥读/写锁定