ELI5 Что означает ключевое слово '&&' после имени функции - PullRequest
0 голосов
/ 13 июня 2018

Я встретил этот код, и я не знаю, что это, кто-то может мне объяснить?

template<class T> base{

protected:

T data;

public:

...

T&& unwrap() && { return std::move(data); }

operator T&&() && { return std::move(data); }

}

Я знаю, operator T&&() является оператором приведения , но я не могу понятьчто означает жирный шрифт && в:

оператор T && () && или T && unwrap () &&

1 Ответ

0 голосов
/ 13 июня 2018

Квалификаторы && и & в функции-члене, подобные этой, указывают на следующее:

  • Квалифицированная функция & будет вызываться для экземпляров lvalue объекта
  • Квалифицированная функция && будет вызываться для rvalue экземпляров объекта

Пример:

#include <iostream>

class Example
{
private:
    int whatever = 0;

public:
    Example() = default;

    // Lvalue ref qualifier
    void getWhatever() & { std::cout << "This is called on lvalue instances of Example\n"; }

    // Rvalue ref qualifier
    void getWhatever() && { std::cout << "This is called on rvalue instances of Example\n"; }
};

int main()
{
    // Create example
    Example a;

    // Calls the lvalue version of the function since it's called on an lvalue
    a.getWhatever();

    // Calls rvalue version by making temporary
    Example().getWhatever();

    return 0;
}

Вывод этого:

This is called on lvalue instances of Example
This is called on rvalue instances of Example

Так как в первом вызове функции мы вызываем его для экземпляра lvalue Example, но во втором вызове мы делаем его временным, для которого мы вызываем функцию, вызывая квалифицированную функцию rvalue.

...