我有以下代码,这些代码不会编译,而且星期五也是如此,我有点疲惫不堪。
#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中,初始化列表的元素被视为 增加下标的聚合成员的初始化程序 或会员订单。每个成员都是复制初始化 相应的初始化子句
长号!!!
任何人都知道初始订单列表是否完全不可能?
答案 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其他问题中获取。