存储在std :: map里面的C ++ std :: unique_ptr使用已删除的函数生成

时间:2015-08-28 10:12:57

标签: c++ dictionary unique-ptr

我有以下代码,这些代码不会编译,而且星期五也是如此,我有点疲惫不堪。

#include <string>
#include <memory>
#include <utility>
#include <map>

template< typename T, typename ...Args >
std::unique_ptr< T > make_unique( Args && ...args )
{
    return std::unique_ptr< T >( new T( std::forward< Args >( args )... ) );
}

struct A
{
};

std::map< std::string, std::unique_ptr< A > > _map = { { "A", make_unique< A >() } }; // <-- ERROR!!

以下编译没有问题

int main()
{
    std::pair< std::string, std::unique_ptr< A > > p { "B", make_unique< A >() };
    _map.insert( std::make_pair( "C", make_unique< A >() ) );
}

我得到的错误是(粗略地,删除了g ++ fluff)

use of deleted function 'constexpr std::pair<...>( const st::pair<...> & )
'constexp std::pair<...>::pair( const std::pair<...> & ) is implicitly deleted because the default definition would be illegal.

Argghh !! 请阅读c ++ 11标准中的内容。

  

按指定的初始化列表初始化聚合时   在8.5.4中,初始化列表的元素被视为   增加下标的聚合成员的初始化程序   或会员订单。每个成员都是复制初始化   相应的初始化子句

长号!!!

任何人都知道初始订单列表是否完全不可能?

1 个答案:

答案 0 :(得分:5)

您无法做很多事情:复制初始化列表中的元素。这与仅移动的类不相符。

有一种方法可以绕过这个&#34;缺陷&#34;但阅读并不是很好;你决定

using map_type  = std::map< std::string, std::unique_ptr< A > >;
using pair_type = map_type::value_type;
pair_type elements[] = { { "A", std::make_unique< A >() }, { "B", std::make_unique< A >() } };

map_type myMap { std::make_move_iterator( begin(elements) ), std::make_move_iterator( end(elements) ) };

将使myMap遍历范围并移动元素,而不是复制。方法请从this其他问题中获取。