防止传递临时值作为常量引用的方法,其更好地缩放然后删除r值过载

问题描述 投票:3回答:1

当想要阻止有人将临时作为const引用传递时,可以删除r值重载:

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...

有没有比这更好的方法?

c++ pass-by-reference rvalue-reference
1个回答
2
投票

这样的事可能吗?很明显你也不想要一个右值。

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

© www.soinside.com 2019 - 2024. All rights reserved.