防止将临时变量作为 const 引用传递的方法,该方法比删除 r 值重载更好地缩放
Method for preventing passing temporaries as const reference that scales better then deleting the r-value overload
当想要阻止某人将临时值作为 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
}
当想要阻止某人将临时值作为 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
}