Visual Studio2013でのC ++ 11リストの初期化の奇妙な動作

Ali Naci Erdem

配列を関数に渡し、毎回「std :: unique_ptr」を書き込まないようにし、インライン構築を可能にするために、配列のエイリアスを作成するtypedef(ItemList)を導入しています。

#include <iostream>
#include <memory>

class Base {
public:
    Base()
    {
        std::cout << "Base ctor" << std::endl;
    };

    virtual ~Base()
    {
        std::cout << "Base dtor" << std::endl;
    };
};

typedef std::unique_ptr<Base> ItemList[];

template<typename T>
class Derived : public Base {
    T val;
public:
    Derived(T i)
    {
        val = i;
        std::cout << "Derived ctor" << val << std::endl;
    };

    ~Derived()
    {
        std::cout << "Derived dtor" << val << std::endl;
    };
};

void dummyFunc(ItemList)
{

}

void testFunc()
{
    dummyFunc(ItemList{
        std::make_unique<Derived<int>>(2),
        std::make_unique<Derived<float>>(3.0f)
    });
}

//Entry point
int main()
{
    testFunc();
    return 0;
}

これは、デバッグビルドと印刷で意図したとおりに機能します。

Base ctor
Derived ctor2
Base ctor
Derived ctor2
Derived dtor2
Base dtor
Derived dtor2
Base dtor

ここまでは順調ですね。しかし、これをリリースモード(すべてのネイティブコンパイラを使用)でビルドすると、次のようになります。

Base ctor
Derived ctor2
Base ctor
Derived ctor3
Derived dtor2
Base dtor

配列の2番目の項目は、配列のライフサイクルを終了しても破棄されません。私が期待するようにそれを機能させる唯一の方法は、C ++ 03スタイルの初期化またはデバッグモードを使用することです。

ItemList tmpList = {
    std::make_unique<Derived<int>>(2),
    std::make_unique<Derived<float>>(2.0f)
};

dummyFunc(tmpList);

これにより、意図した動作が発生します(すべてのデストラクタが呼び出されます)。

私はこれを他のコンパイラでまだテストしていませんが、これは予想される動作ですか?私は何を間違っているのですか、それとも何かが足りないのですか?

更新:

興味深いことに、dtorはBaseインスタンスで期待どおりに呼び出されます。

dummyFunc(ItemList{
    std::make_unique<Base>(),
    std::make_unique<Base>()
});

出力;

Base ctor
Base ctor
Base dtor
Base dtor

また、配列を初期化するだけで(関数呼び出しなしで)、関数呼び出しの場合と同じように動作します。

Ali Naci Erdem

Visual Studio 2015に切り替えます。これは、VS2013コンパイラの実装バグである可能性があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Visual Studio2013でのcURL

分類Dev

VIsual Studio2013のCのGUI

分類Dev

Visual Studio2013での参照の追加

分類Dev

Visual Studio2013でのC ++とCudaの速度

分類Dev

Visual Studio2013のC ++-<クラス>は未定義です

分類Dev

Visual Studio2013のOpenGL

分類Dev

Visual Studio2013でのSilverlight4のサポート

分類Dev

Visual Studio2013で不要な垂直方向の空白を削除する方法

分類Dev

Visual Studio2013でc ++ 11を有効にする

分類Dev

TFS Visual Studio2013での保留解除の変更

分類Dev

Visual Studio2013でのsos.dllの使用法

分類Dev

Visual Studio2013でのIISの高いCPU使用率

分類Dev

Visual Studio2013のXAMLエラー

分類Dev

Visual Studio2013の環境変数

分類Dev

Visual Studio2013の正規表現

分類Dev

MS Visual Studio2013のstd :: reference_wrapper

分類Dev

Visual Studio2013で未使用の関数を削除する方法

分類Dev

Visual Studio2013現在の選択で検索して置換

分類Dev

Visual Studio2013のListViewでMySQLから行を削除する

分類Dev

Visual Studio2013での奇妙な「バグ/ユーザーエラー」

分類Dev

Visual Studio2013で発生する可能性のあるC / C ++コンパイラのバグ

分類Dev

Visual Studio2013での単体テストレポートの生成

分類Dev

Visual Studio2013の使用中の.cファイルの構文エラー

分類Dev

Visual Studio2013でのVisualStudio2010プロジェクトの継続

分類Dev

Visual Studio2013のTypescriptでのAngularJS「モジュール」宣言の難しさ

分類Dev

Visual Studio2013のTypescriptでのAngularJS「モジュール」宣言の難しさ

分類Dev

Visual Studio2013のピークがEscキーで閉じられない

分類Dev

Visual Studio2013で2つのクラスを同時に表示する方法

分類Dev

Visual Studio2013のGitクライアントは「オフライン」です

Related 関連記事

  1. 1

    Visual Studio2013でのcURL

  2. 2

    VIsual Studio2013のCのGUI

  3. 3

    Visual Studio2013での参照の追加

  4. 4

    Visual Studio2013でのC ++とCudaの速度

  5. 5

    Visual Studio2013のC ++-<クラス>は未定義です

  6. 6

    Visual Studio2013のOpenGL

  7. 7

    Visual Studio2013でのSilverlight4のサポート

  8. 8

    Visual Studio2013で不要な垂直方向の空白を削除する方法

  9. 9

    Visual Studio2013でc ++ 11を有効にする

  10. 10

    TFS Visual Studio2013での保留解除の変更

  11. 11

    Visual Studio2013でのsos.dllの使用法

  12. 12

    Visual Studio2013でのIISの高いCPU使用率

  13. 13

    Visual Studio2013のXAMLエラー

  14. 14

    Visual Studio2013の環境変数

  15. 15

    Visual Studio2013の正規表現

  16. 16

    MS Visual Studio2013のstd :: reference_wrapper

  17. 17

    Visual Studio2013で未使用の関数を削除する方法

  18. 18

    Visual Studio2013現在の選択で検索して置換

  19. 19

    Visual Studio2013のListViewでMySQLから行を削除する

  20. 20

    Visual Studio2013での奇妙な「バグ/ユーザーエラー」

  21. 21

    Visual Studio2013で発生する可能性のあるC / C ++コンパイラのバグ

  22. 22

    Visual Studio2013での単体テストレポートの生成

  23. 23

    Visual Studio2013の使用中の.cファイルの構文エラー

  24. 24

    Visual Studio2013でのVisualStudio2010プロジェクトの継続

  25. 25

    Visual Studio2013のTypescriptでのAngularJS「モジュール」宣言の難しさ

  26. 26

    Visual Studio2013のTypescriptでのAngularJS「モジュール」宣言の難しさ

  27. 27

    Visual Studio2013のピークがEscキーで閉じられない

  28. 28

    Visual Studio2013で2つのクラスを同時に表示する方法

  29. 29

    Visual Studio2013のGitクライアントは「オフライン」です

ホットタグ

アーカイブ