[[deprecated]]
void foo(){};
int main()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在VS2017中产生以下错误:
1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>deprecation.cpp
1>d:\source\deprecation.cpp(6): error C4996: 'foo': was declared deprecated
1>d:\source\deprecation.cpp(2): note: see declaration of 'foo'
1>Done building project "test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)
不幸的是,搜索此错误会导致“如何使用[[deprecated]]”和“不赞成使用哪些功能”的问题。样式问题。
我检查的每个资源似乎都建议使用[[deprecated]]应该和上面写的一样简单-预期会出现编译器错误/警告,但不是编译失败。注释掉[[deprecated]]行可成功构建。
项目的目标是Windows SDK版本10.0.17763.0。
cl.exe版本是19.16.27027。
我是否错过了使用[[deprecated]]的显而易见的东西,还是VS2017寻找打破它的方法?
考虑以下:
unique_ptr<int> foo = make_unique<int>(42);
auto lambda = [bar = move(foo)]()
{
/* Do something with bar */
};
lambda(); // No issues invoking this
cout << "*foo = " << *foo; //Attempts to dereference foo will segfault
Run Code Online (Sandbox Code Playgroud)
捕获诸如unique_ptr之类的东西需要使用std :: move,以保持unique_ptr的唯一性。但是,当我想在销毁lambda之后使用同一智能指针时该怎么办?使用foo将产生段错误,并且bar超出了该范围。
也许撇开lambda的非正统用法,我如何找回unique_ptr?它会永远被困在lambda中吗?
我有一个类,其复制构造函数已被删除。当尝试迭代std::vector
此类的包含对象时,我无法以“好的”方式做到这一点,并且必须使用某种迭代变量。
struct foo {
foo() :
val(0)
{}
foo(const foo&) = delete;
int val;
};
int main() {
std::vector<foo> fooVec(5);
for (auto f : fooVec) //C2280 - attempting to reference a deleted function!
{
std::cout << f.val << std::endl;
}
for (int i = 0; i < fooVec.size(); i++) //no problems
{
std::cout << fooVec[i].val << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种巧妙的方法可以迭代不可复制对象的向量,而无需使用迭代变量?
我非常热衷于学习如何使用现代功能,并尝试学习如何正确处理特殊成员函数,作为现代化某些现有代码的一部分(我们仍然有原始指针)。