0

const-overload を扱うときにコードの重複を避けるために、次のように書きました。

#include <memory>

class A
{
    std::shared_ptr<int> _data;
public:
    const A lightCopy() const
    {
        A a;
        a._data = _data;
        return a;
    }

    A lightCopy()
    {
        using const_a_t = const A;
        const_a_t &const_me = *this;
        return const_me.lightCopy(); // const object here
    }
};

int main()
{
    A a;
    auto b = a.lightCopy();
}

const_castは非 const バージョンで使用されます。それ以外の場合は、const-method での非 const 関数呼び出しになり、おそらくオブジェクトが変更され、気付かれずに回避されるためです ( const_cast. また、非 const から const への const キャストは問題を引き起こさないはずです。

そして、ここでの質問は次のとおりです。オブジェクトを const_cast できないため、呼び出されたlightCopy()オブジェクトが const オブジェクトを返し、実際の戻り値の型が const ではないため、RVO は不可能であり、追加のコピーが作成される可能性はありますか?

4

1 に答える 1

2

12.8 [class.copy] パラグラフ 31 のリストの 3 番目の項目に従って、ソースと宛先が同じ「cv- un修飾型」を持っている場合、一時オブジェクトのコピー省略が許可されます。

参照 (12.2) にバインドされていない一時クラス オブジェクトが同じ cv 非修飾型のクラス オブジェクトにコピー/移動される場合、一時オブジェクトをターゲットに直接構築することにより、コピー/移動操作を省略できます。省略されたコピー/移動の

つまり、引用されたコードのコピーの省略許可されます。

元の例でデストラクタをインストルメント化すると、clangIntel のコンパイラ、およびEDG のフロントエンドはコピーを省略しますが、 gccは省略しません。つまり、省略可能なすべてのコピーが省略されることを意味する 2 つのデストラクタ呼び出ししかありません。b宣言方法に関係なく、コピーは省略されます。、、およびbを使用して宣言しました。autoAA const

于 2015-09-02T22:33:13.477 に答える