Метод предотвращения передачи временных значений в качестве константы, который масштабируется лучше, чем удаление перегрузки r-значения - PullRequest
3 голосов
/ 18 апреля 2019

Когда кто-то хочет запретить кому-либо передавать временную переменную в качестве константной ссылки, можно удалить перегрузку 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...

Существуют ли методы, которые масштабируются лучше, чем этот?

1 Ответ

2 голосов
/ 18 апреля 2019

Нечто подобное может быть? Это очень ясно показывает, что вам не нужно и значение.

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

...