【发布时间】:2016-12-23 04:00:21
【问题描述】:
我正在将一些旧代码从 VC 2013 移动到 2015。
下面的简化代码在 VC 2013 中运行良好,但在 2015 年失败:
error C2664: 'void main::<lambda_da721648e605a5fd45c9a3fb8c3d06f6>::operator ()(main::D *&) const': cannot convert argument 1 from 'main::D *' to 'main::D *&'
我不是在寻找解决方案,而是在寻找改变的原因和原因。
谢谢。
#include <memory>
int main()
{
class D{};
auto mydel = []( D*&p ) { delete p; p = 0; };
std::unique_ptr< D, decltype(mydel) > up( new D );
return 0;
}
【问题讨论】:
-
显然
unique_ptr的内部结构过去总是使用左值pointer调用删除器,但现在至少使用右值pointer调用它一次。 -
您确定在两个版本中使用相同的设置吗?这可能与 MSVC 臭名昭著的扩展有关,该扩展允许将右值绑定到非 const 左值引用。也许他们在 VS2015 中默认禁用此功能?
-
@Praetorian 我对两个版本都使用默认设置。我不知道如何更改此选项。
-
@ZDF 你可以在
Project Properties -> C/C++ -> Language -> Disable Language Extensions改一下 -
@Rakete1111 关/开没有区别。
标签: c++ c++11 visual-studio-2013 lambda visual-studio-2015