我和我的同事正在使用更新的GCC 8.2编译器进行开发。以前一直在-std=c++11
上使用GCC 4.8。我很惊讶地发现,在GCC 8.2中,unique_ptr会自动传输到shared_ptr。参见以下最小示例:
#include <iostream>
#include <memory>
using namespace std;
shared_ptr<int>
getMeAnInt()
{
auto ret = unique_ptr<int>(new int(32));
return ret;
}
int main()
{
auto i = getMeAnInt();
cout << *i << endl;
}
使用GCC 4.8,此操作无法编译,因为在返回ret以将unique_ptr转移到shared_ptr时,需要显式的std :: move。在GCC 8.2中,它可以编译并正常工作。
GCC 4.8失败: https://godbolt.org/z/I4g9dI
相同的代码,但在GCC 8.2中成功: https://godbolt.org/z/ZeDajS
我认为这是一个有意的更改,但是有人可以向我解释更改背后的原因吗?到目前为止,我一直以这样一个假设为前提,即明确的std::move
要求是有价值的编译器强制执行,以明确表明所有权正在转移。