移动构造函数我有一些代码:与unordered_map
Class A{
//...A has a move ctor here.
};
unordered_map<int, A> bla;
A tmp;
//operations on tmp
bla.insert(make_pair<int, A>(1, move(tmp)));
我想呼叫转移构造函数,而不是A级的副本构造函数是这个代码是否正确? 我这么认为。奇怪的是它为Ubuntu Precise编译和工作(g ++ show version of 4.6.3)。但在CentOS上,它未能编译。前几行是:
In substitution of ‘template<class _From1, class _To1> static decltype ((__test_aux<_To1>(declval<_From1>()), std::__sfinae_types::__one())) std::__is_convertible_helper<_From, _To, false>::__test(int) [with _From1 = _From1; _To1 = _To1; _From = const A&; _To = A] [with _From1 = const A&; _To1 = A]’:
/gcc/x86_64-redhat-linux/4.7.1/../../../../include/c++/4.7.1/type_traits:1258:70: required from ‘constexpr const bool std::__is_convertible_helper<const A&, A, false>::value’
/gcc/x86_64-redhat-linux/4.7.1/../../../../include/c++/4.7.1/type_traits:1263:12: required from ‘struct std::is_convertible<const A&, A>’
/gcc/x86_64-redhat-linux/4.7.1/../../../../include/c++/4.7.1/type_traits:116:12: required from ‘struct std::__and_<std::is_convertible<const int&, int>, std::is_convertible<const A&, A> >’
/gcc/x86_64-redhat-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_pair.h:113:38: required from ‘constexpr std::pair<typename std::__decay_and_strip<_T1>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&) [with _T1 = int; _T2 = A; typename std::__decay_and_strip<_T2>::__type = A; typename std::__decay_and_strip<_T1>::__type = int]’
它似乎试图调用复制ctor。关于这个错误的任何想法?
那么,我的CentOS没有最新版本的gcc/libstdC++,所以实际上我自己构建这些(gcc 4.7.1),并将它们安装在我的主目录中。这很重要吗?这是编译时我的配置:
Target: x86_64-redhat-linux
Configured with: ../gcc-4.7.1/configure --prefix=/home/bla/usr/ --with-mpc=/home/bla/usr/ --with-mpfr=/home/bla/usr/ --with-gmp=/home/bla/usr/ --disable-multilib --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++ --enable-java-awt=gtk --disable-dssi --disable-plugin --with-cpu=generic --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.7.1 (GCC)
UPDATE: 也许有某事错的“移动语义”的使用。我试着用STL字符串“移动”:
unordered_map<int, string> bla;
string tmp("hello world");
//operations on tmp
bla.emplace(1, move(tmp));
这样就好了,内部字符真的“移动”了。
不过,这并不与我的A级工作...这是一个:
class A
{
public:
A(){...}
~A(){}
A(A&& other){...}
private:
A& operator = (const A& other);
A& operator = (A&& other);
A(const A& other);
};
UPDATE: 我得到它的工作,当A为:
class A
{
public:
A(){...}
~A(){}
A(A&& other){...}
A(const A& other){}
private:
A& operator = (const A& other);
A& operator = (A&& other);
};
讲究到COPY CTOR。现在我所有的移动语义工作都是正确的,并且拷贝ctor在运行时实际上并不叫。我对“移动”有错吗?
旧的gcc版本? – 2012-07-17 12:41:43
在Arch Linux上用g ++ 4.7.1测试过,效果很好。 – rodrigo 2012-07-17 12:43:28
实际上,如果libstdC++版本足够新,您应该使用'.emplace'。 'bla.emplace(1,std :: move(tmp))'。 – kennytm 2012-07-17 14:13:30