0

使用const,如注释所示,msvc 11 和 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
i _Tp = 常量 wchar_t* 常量;_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 对象。该错误是因为您的移动构造函数。

unique_ptr 已删除声明为的复制构造函数和移动构造函数:

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

由于您的 unique_ptr 已声明为 const,因此它选择复制构造函数,而不是移动构造函数。

于 2012-07-06T09:17:47.387 回答
1

没有具有签名的副本 c-tor unique_ptr(const unique_ptr&);

于 2012-07-06T09:00:47.153 回答