在 unique_ptrs 向量中搜索时出现非标准扩展警告
non standard extension warning when searching in a vector of unique_ptrs
在以下代码片段中:
std::vector<std::unique_ptr<int>> vec;
vec.emplace_back(std::make_unique<int>(1));
vec.emplace_back(std::make_unique<int>(2));
vec.emplace_back(std::make_unique<int>(3));
vec.emplace_back(std::make_unique<int>(4));
vec.emplace_back(std::make_unique<int>(5));
auto & itr = std::find_if(vec.begin(), vec.end(), [](std::unique_ptr<int> & val)->bool
{
return *val == 5;
});
vec.erase(itr);
我收到以下警告:
Severity Code Description Project File Line
Warning C4239 nonstandard extension used: 'initializing': conversion from 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::unique_ptr<int,std::default_delete<_Ty>>>>>' to 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::unique_ptr<int,std::default_delete<_Ty>>>>> &'
我做错了什么?
我在 VS2015 上,这个警告只出现在警告级别 4。我应该忽略它还是会导致任何偷偷摸摸的问题(如果涉及 unique_ptr
s 的向量的类似代码用于更大的上下文)?
find_if
returns 按值指向匹配元素的迭代器,而您试图将其绑定到非常量引用,这是非法的。 VC++ 编译器有一个臭名昭著的扩展允许这样做,但幸运的是当您设置 /W4
时会生成警告。将您的代码更改为
auto itr = std::find_if(...);
您从 find_if.
return 上通过非常量引用临时获取
要么
auto itr = ... ;
或
const auto& itr = ... ;
在以下代码片段中:
std::vector<std::unique_ptr<int>> vec;
vec.emplace_back(std::make_unique<int>(1));
vec.emplace_back(std::make_unique<int>(2));
vec.emplace_back(std::make_unique<int>(3));
vec.emplace_back(std::make_unique<int>(4));
vec.emplace_back(std::make_unique<int>(5));
auto & itr = std::find_if(vec.begin(), vec.end(), [](std::unique_ptr<int> & val)->bool
{
return *val == 5;
});
vec.erase(itr);
我收到以下警告:
Severity Code Description Project File Line
Warning C4239 nonstandard extension used: 'initializing': conversion from 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::unique_ptr<int,std::default_delete<_Ty>>>>>' to 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::unique_ptr<int,std::default_delete<_Ty>>>>> &'
我做错了什么?
我在 VS2015 上,这个警告只出现在警告级别 4。我应该忽略它还是会导致任何偷偷摸摸的问题(如果涉及 unique_ptr
s 的向量的类似代码用于更大的上下文)?
find_if
returns 按值指向匹配元素的迭代器,而您试图将其绑定到非常量引用,这是非法的。 VC++ 编译器有一个臭名昭著的扩展允许这样做,但幸运的是当您设置 /W4
时会生成警告。将您的代码更改为
auto itr = std::find_if(...);
您从 find_if.
return 上通过非常量引用临时获取要么
auto itr = ... ;
或
const auto& itr = ... ;