在 LLVM 中调用隐式删除的复制构造函数(将代码从 windows 移植到 mac)
Call to implicitly-deleted copy constructor in LLVM(Porting code from windows to mac)
我们正在将一些 c++ 代码从 windows 移植到 mac,并且在使用 c++11 的 LLVM 6.1 编译它时遇到问题。我们在 "Call to implicitly-deleted copy contructor" 的所有地方都遇到了错误,其中一些错误会在我们的代码中弹出。
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 时遇到过这个错误?我觉得它好像与编译器相关,并且必须有一些我不知道的简单修复,因为我在我无法实际编辑的地方(内存,矢量等......)遇到错误
这行代码很含糊:
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)
所以循环的每次迭代都是复制 来自_unhandledFiles 的值。
解决方法是使用迭代器或:
for (auto& it: _unhandledFiles)
---------^
----编辑----
由于这造成的混乱,C++14 引入了 decltype(auto)
但如果 rhs 不是引用,使用它会引入一个副本。
std::string s;
std::string& sr = s;
auto xr1 = sr; // std::string xr1 -> copy
auto& xr2 = sr; // std::string& xr2 -> reference
decltype(auto) xr3 = sr; // std::string& xr3 -> reference
auto xv1 = s; // std::string xv1 -> copy
auto& xv2 = s; // std::string& xv2 -> reference
decltype(auto) xv3 = s; // std::string xv3 -> copy
我们正在将一些 c++ 代码从 windows 移植到 mac,并且在使用 c++11 的 LLVM 6.1 编译它时遇到问题。我们在 "Call to implicitly-deleted copy contructor" 的所有地方都遇到了错误,其中一些错误会在我们的代码中弹出。
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 时遇到过这个错误?我觉得它好像与编译器相关,并且必须有一些我不知道的简单修复,因为我在我无法实际编辑的地方(内存,矢量等......)遇到错误
这行代码很含糊:
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)
所以循环的每次迭代都是复制 来自_unhandledFiles 的值。
解决方法是使用迭代器或:
for (auto& it: _unhandledFiles)
---------^
----编辑----
由于这造成的混乱,C++14 引入了 decltype(auto)
但如果 rhs 不是引用,使用它会引入一个副本。
std::string s;
std::string& sr = s;
auto xr1 = sr; // std::string xr1 -> copy
auto& xr2 = sr; // std::string& xr2 -> reference
decltype(auto) xr3 = sr; // std::string& xr3 -> reference
auto xv1 = s; // std::string xv1 -> copy
auto& xv2 = s; // std::string& xv2 -> reference
decltype(auto) xv3 = s; // std::string xv3 -> copy