在LLVM中调用隐式删除的复制构造函数(将代码从windows移植到mac)

时间:2015-06-15 16:56:29

标签: c++ macos c++11 compiler-errors llvm

我们正在将一些c ++代码从windows移植到mac,并且在使用c ++ 11进行LLVM 6.1编译时遇到了问题。我们遇到的错误遍及"调用隐式删除的复制构造函数"其中一些错误出现在我们的代码中。

for (auto it : _unhandledFiles)//ERROR HERE
{
    if (it.first == file)
    {
        return true;
    }
}
return false;

然而,它们也出现在LLVM编译器的内存文件以及矢量文件中。

template <class _Up, class... _Args>
    _LIBCPP_INLINE_VISIBILITY
    void
    construct(_Up* __p, _Args&&... __args)
    {
        ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);//ERROR HERE
    }


vector<_Tp, _Allocator>::operator=(const vector& __x)
{
if (this != &__x)
{
    __base::__copy_assign_alloc(__x);
    assign(__x.__begin_, __x.__end_);//ERROR HERE
}
return *this;
}

在将c ++代码从Windows移植到Mac之前,有没有人遇到此错误?我觉得它好像是编译器相关的,必须有一些简单的修复,我只是不知道,因为我在实际编辑的地方得到错误(内存,矢量等......)< / p>

1 个答案:

答案 0 :(得分:0)

这行代码含糊不清:

Text

for (auto it : _unhandledFiles)//ERROR HERE 使用模板参数推导,所以

auto
上述代码std::string s; std::string& sr = sr; auto x = sr; 中的

推断为x类型,而不是std::string。所以你的循环相当于:

std::string&

for (_unhandledFiles::value_type it : _unhandledFiles)
// aka
for (auto uhfIt = _unhandledFiles.cbegin();
         uhfIt != _unhandledFiles.cend();
         ++uhfIt) {
    _unhandledFiles::value_type it = *uhfIt; // COPY
    // ... your code here ...
    it.dtor(); // obviously not, I'm just emphasizing.
}

因此循环的每次迭代都是从复制值。

修复方法是使用迭代器或:

for (_unhandledFiles::value_type& it : _unhandledFiles)

----编辑----

由于这引起了混淆,C ++ 14引入了for (auto& it: _unhandledFiles) ---------^ ,但如果rhs不是引用,则使用它会引入副本。

decltype(auto)