0

コメントで示されているようにconst、を使用すると、msvc11およびg++4.7.0はこれをコンパイルすることを拒否します。

#include <memory>       // std::unique_ptr
#include <utility>      // std::move
using namespace std;

struct CommandLineArgs
{
    typedef unique_ptr<
        wchar_t const* const [],
        void(*)( wchar_t const* const* )
        > PointerArray;

    //PointerArray const  args;         // Oops
    PointerArray        args;
    int const           count;

    static wchar_t const* const* parsed(
        wchar_t const       commandLine[],
        int&                count
        )
    {
        return 0;
    }

    static void deallocate( wchar_t const* const* const p )
    {
    }

    CommandLineArgs(
        wchar_t const   commandLine[]   = L"",
        int             _               = 0
        )
        : args( parsed( commandLine, _ ), &deallocate )
        , count( _ )
    {}

    CommandLineArgs( CommandLineArgs&& other )
        : args( move( other.args ) )
        , count( move( other.count ) )
    {}
};

int main()
{}

エラーメッセージは特に有益ではないようですが、g++の出力は次のとおりです。

main.cpp:コンストラクター内'CommandLineArgs :: CommandLineArgs(CommandLineArgs &&)':
main.cpp:38:38:エラー:削除された関数の使用'std :: unique_ptr :: unique_ptr(const std :: unique_ptr&)[w
ith _Tp = const wchar_t * const; _Dp = void(*)(const wchar_t * const *); std :: unique_ptr = std :: unique_ptr] '
c:\ program files(x86)\ mingw \ bin \ ../ lib / gcc / mingw32 / 4.7.0 / include / c ++ / memory:86:0からインクルードされたファイル内
                 main.cpp:1から:
c:\ program files(x86)\ mingw \ bin \ ../ lib / gcc / mingw32 / 4.7.0 / include / c ++ / bits / unique_ptr.h:402:7:エラー:ここで宣言されています

なんで?

4

2 に答える 2

6

constオブジェクトを移動することはできません。エラーは、moveコンストラクターが原因です。

unique_ptrは、次のように宣言されたコピーコンストラクターと移動コンストラクターを削除しました。

unique_ptr( const unique_ptr & other );
unique_ptr( unique_ptr && other );

unique_ptrはdeclatedconstであるため、移動コンストラクターではなく、コピーコンストラクターを選択します。

于 2012-07-06T09:17:47.387 に答える
1

署名unique_ptr(const unique_ptr&);を持つコピーc-torはありません。

于 2012-07-06T09:00:47.153 に答える