下面的snipplet是否正确用于取消定义所有其他方法和类的构造函数?
struct Picture {
// 'explicit': no accidental cast from string to Picture
explicit Picture(const string &filename) { /* load image from file */ }
// no accidental construction, i.e. temporaries and the like
Picture() = delete;
// no copy
Picture(const Picture&) = delete;
// no assign
Picture& operator=(const Picture&) = delete;
// no move
Picture(Picture&&) = delete;
// no move-assign
Picture& operator=(Picture&&) = delete; // return type correct?
};
Run Code Online (Sandbox Code Playgroud)
这会删除每个默认的编译器实现,只留下析构函数,对吧?没有它,我猜这个类(几乎)无法使用,但我也可以删除它,对吗?
Picture&move-assign 的返回类型operator=(Picture&&)是否正确?如果我Picture&&为回归类型写的,它会有所作为吗?
c++ operator-overloading rvalue-reference move-semantics c++11
有没有办法让编译器(特别是 MSVC 2017,但其他也可能很有趣)在使用特定类的复制构造函数和复制赋值运算符的位置发出警告(并且以一种可以在每个调用站点被显式抑制,即使是间接的)?
这个问题询问有关产生编译错误的问题,现在使用 C++11 删除的方法很容易,但我希望代码仍然可以编译,只是输出警告。
原因是我有一个类,目前在整个代码库中被大量复制。我不想阻止它被复制(其中一些是必要的),但我确实想检查每个位置以确定是否应该将其更改为移动或通过引用传递。
让编译器暂时将构造函数的使用标记为警告似乎是一个很好的方法。
我尝试添加这样的内容:
__declspec(deprecated) MyType(MyType const&) = default;
Run Code Online (Sandbox Code Playgroud)
但这是行不通的;显然= default胜过任何其他修饰符。
我做了同样的事情,但完全实现了该方法,这几乎有效 - 它在每个调用站点生成 C4996,我可以查看这些并更改它们或附加:
#pragma warning(suppress:4996)
Run Code Online (Sandbox Code Playgroud)
如果我很高兴这是必需的副本。(我最终计划删除这些以及构造函数的弃用——这只是跟踪我尚未处理的内容的内务处理。)
不幸的是,有些情况我无法通过这种方式抑制,例如:
std::vector<MyType> list;
list.push_back(type);
list.emplace_back(MyType{ type });
Run Code Online (Sandbox Code Playgroud)
这些行中的每一行都会引发警告(第一行是因为它是具有常规复制构造函数的类内的字段声明),但这里只能直接抑制第三行。前两个在该行代码中引发警告<vector>,并且似乎不受警告抑制(或禁用)的影响。
有什么方法可以解决这个问题,或者有其他方法可以做我想要的事情吗?
c++ copy-constructor suppress-warnings visual-c++ visual-studio-2017