Сохраните возвращаемое значение функции в ссылочном C++

выше ответ для меня, я попробовал изменить litte, я объявляю стиль для класса в элементе ресурсов.

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

в declare-styleable, атрибут name ссылается на имя класса, поэтому У меня был вызов класса вида «com.my.package.name.VerticalView», он представлял, что это объявление должно использоваться в VerticalView или подклассах VerticalView. поэтому мы можем объявить стиль следующим образом:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

, поэтому мы не объявили пространство имен в элементе ресурсов, оно все еще работает.

24
задан Ruud 12 May 2010 в 19:55
поделиться

3 ответа

Не разрешается привязывать временную ссылку к неконстантной ссылке, но если вы сделаете свою ссылку постоянной, вы продлите время жизни временной ссылки до ссылки, см. этот пост Дэнни Калева об этом .

Короче говоря:

const A& mySecondObject = myFunction();
32
ответ дан Alexander Torstling 28 November 2019 в 23:23
поделиться

Это возможно с константной ссылкой.

myFunction возвращает значение, поэтому возвращаемое значение является временным объектом. Вы можете привязать временную ссылку к константной ссылке, и время жизни временной привязки увеличивается до времени жизни ссылки. Вы не можете привязать временную ссылку к неконстантной ссылке (к сожалению).

Возвращаемое значение myFunction может быть копией из myObject. С положительной стороны, elision конструктора копирования (в данном случае называемого «оптимизацией именованного возвращаемого значения») позволяет компилятору напрямую создавать myObject во временное значение, которое является возвращаемым значением myFunction, предположительно расположенным где-то в стеке вызывающий код. Если это так, то когда myObject выходит из области видимости, объект фактически не уничтожается. Оптимизация обычно реализуется - например, GCC (обычно?) Делает это даже без каких-либо флагов оптимизации.

Копирование ctor elision также позволяет компилятору избегать любого копирования, если вы это сделали:

A mySecondObject = myFunction();

Это требует применения обоих допустимых типов копирования ctor elision: (1) возврат именованного значения из функции и (2) инициализация объекта из временного.

7
ответ дан Steve Jessop 28 November 2019 в 23:23
поделиться

Возможно, вас заинтересует оптимизация возврата по значению , которую делают многие компиляторы, чтобы избежать вызова конструктора копирования.

7
ответ дан 28 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: