我正在阅读C ++核心准则,并遇到了以下规则:“直到您有一个值对其进行初始化之前,都不要声明变量” https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#es22-dont-declare一个变量,直到您有一个值来初始化它
它描述以下代码为错误代码:
SomeLargeType var;
if (cond) // some non-trivial condition
Set(&var);
else if (cond2 || !cond3) {
var = Set2(3.14);
}
else {
var = 0;
for (auto& e : something)
var += e;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这一点未能描述解决该确切问题的方法。有时,您只需要根据条件不同地初始化大对象。我想到的唯一规避方法是:
SomeLargeType * var;
if (cond) // some non-trivial condition
var = new SomeLargeType(123);
else if (cond2 || !cond3) {
var = new SomeLargeType(3.14);
}
Run Code Online (Sandbox Code Playgroud)
但是,即使我使用了智能指针,也感觉到不必要/不安全,最重要的是,这要比初始方法差。
最佳解决方案是什么?
必须将不可复制类的实例填充到地图中。例如使用此代码:
#include <map>
class NoCopyClass
{
public:
NoCopyClass() {};
NoCopyClass(int value) {};
NoCopyClass& operator=(const NoCopyClass&) = delete;
};
int main()
{
std::map<int, NoCopyClass> my_map;
my_map[3] = NoCopyClass(20);
}
Run Code Online (Sandbox Code Playgroud)
除非您注释掉复制构造函数的删除,否则无法编译。你可以在这里试试:https : //onlinegdb.com/ByBh0NubU
当类不可复制时,添加新地图元素的正确方法是什么?
非常感谢!