Следующий код хорошо компилируется на clang-3.8 и gcc 4.9.3.VS 2015 Update 3 ошибка для оператора присваивания удаленных копий
#include <vector>
#include <algorithm>
#include <iterator>
class foo
{
};
class MyVec {
public:
MyVec() {}
};
class MyInsert :
public std::iterator<std::output_iterator_tag, void, void, void, void>
{
protected :
MyVec &fV;
public :
explicit MyInsert (MyVec &v) : fV(v) {}
MyInsert & operator= (void *value)
{
return *this;
}
MyInsert & operator*() { return *this; }
MyInsert & operator++() { return *this; }
MyInsert & operator++(int) { return *this; }
};
class test
{
public:
void method()
{
MyVec retv;
std::vector<const foo*> foovec;
std::transform(foovec.begin(), foovec.end(),MyInsert(retv),[](const foo*)->void* { return nullptr;});
}
};
int main(){
return 0;
}
Однако, если скомпилировано приложение VS 2015 Update 3, оно выходит из строя со следующим сообщением об ошибке.
c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility(458): error C2280: 'MyInsert &MyInsert::operator =(const MyInsert &)': attempting to reference a deleted function
test\mytests\main.cpp(33): note: compiler has generated 'MyInsert::operator =' here
c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(926): note: see reference to function template instantiation '_Iter &std::_Rechecked<_OutIt,_OutIt>(_Iter &,_UIter)' being compiled
with
[
_Iter=MyInsert,
_OutIt=MyInsert,
_UIter=MyInsert
]
c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(950): note: see reference to function template instantiation '_OutIt std::_Transform_no_deprecate1<const foo**,_OutIt,_Fn1>(_InIt,_InIt,
_OutIt,_Fn1 &,std::input_iterator_tag,std::_Any_tag)' being compiled
with
[
_OutIt=MyInsert,
_Fn1=test::method::<lambda_45e8626339fc29aadca2bf2dd3420511>,
_InIt=const foo **
]
c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(960): note: see reference to function template instantiation '_OutIt std::_Transform_no_deprecate<_InIt,_OutIt,_Fn1>(_InIt,_InIt,_OutIt,
_Fn1 &)' being compiled
with
[
_OutIt=MyInsert,
_InIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<const foo *>>>,
_Fn1=test::method::<lambda_45e8626339fc29aadca2bf2dd3420511>
]
test\mytests\main.cpp(45): note: see reference to function template instantiation '_OutIt std::transform<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<const
foo *>>>,MyInsert,test::method::<lambda_45e8626339fc29aadca2bf2dd3420511>>(_InIt,_InIt,_OutIt,_Fn1)' being compiled
with
[
_OutIt=MyInsert,
_InIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<const foo *>>>,
_Fn1=test::method::<lambda_45e8626339fc29aadca2bf2dd3420511>
]
]
Я не могу понять, почему он (VS Compiler) не может найти оператора присваивания копии, которая принимает void *
и возвращает MyInsert &
, когда явно один прямо предусмотрено.
Копаем больше в (следуя трассировке сообщения об ошибке)
c:\program files (x86)\microsoft visual studio14.0\vc\include\xutility
и
c:\program files (x86)\microsoft visual studio14.0\vc\include\algorithm
также заставило меня понять, что фактическая функция, где вызывается std::transformation
алгоритм, то явно предусмотрено вызывается копирование, после чего она вводит функцию _Rechecked
, и она переходит в xutility
.
В этой функции, оператор копирующего присваивания вызывается, который ожидает (вход в MyInsert&
и выводится как MyInsert&
) и так как оно не найти, он отображает сообщение об ошибке, как attempting to reference...
.
Правильно ли этот анализ? Если нет, то почему не удается скомпилировать код, который компилируется на других основных компиляторах? Может быть, ошибка?
P.S
Текущая работа по всему, что я использую, чтобы удалить опорный элемент в MyInsert
класса с нереференсного члена.
@Oktalist ах, мой плохой тогда! – Yakk