Оптимизация возвращаемого значения и геттеры const для элементов данных [дубликаты]

Я понимаю, что RVO позволяет копировать, среди прочего, временные и локальные переменные, но как насчет элементов данных?

Чтобы сфокусироваться на вопросе, какой из следующих трех вариантов является лучшим способом написать получатель констант для члена данных (учитывая RVO и C++11)?

class Widget { /* some large user-defined class */ };

class C
{
public:
    const Widget& getWidget1() const { return w; }
    const Widget getWidget2() const { return w; }
    Widget getWidget3() const { return w; }

private:
    Widget w;
};

person mr_T    schedule 08.03.2016    source источник
comment
Используйте 1_. Я вижу много ситуаций, когда копирование будет проблематичным.   -  person πάντα ῥεῖ    schedule 08.03.2016
comment
const Widget getWidget2() const плохо, const перед возвращаемым значением запрещает семантику перемещения   -  person TemplateRex    schedule 08.03.2016
comment
@πάνταῥεῖ как насчет проблем с продолжительностью жизни с C{}.getWidget1()?   -  person TemplateRex    schedule 08.03.2016
comment
@TemplateRex Справедливое замечание. Хотя зависит от фактического варианта использования.   -  person πάντα ῥεῖ    schedule 08.03.2016
comment
const Widget& getWidget() const { return w; } но Widget takeWidget() { return std::move(w); }   -  person Jarod42    schedule 08.03.2016
comment
@Jarod42 или используйте квалификаторы ссылок: const Widget& getWidget() const &   -  person TemplateRex    schedule 08.03.2016