Является ли значение по умолчанию для nullptr в карте указателей определенного поведения?
Следующий код, кажется, всегда следует за истинной ветвью.
#include <map>
#include <iostream>
class TestClass {
// implementation
}
int main() {
std::map<int, TestClass*> TestMap;
if (TestMap[203] == nullptr) {
std::cout << "true";
} else {
std::cout << "false";
}
return 0;
}
Определено ли поведение неинициализированного указателя, указывающего наnullptr
или артефакт моего компилятора?
Если нет, как я могу обеспечить переносимость следующего кода? В настоящее время я использую подобную логику, чтобы вернуть правильный экземпляр синглтона дляlog file
:
#include <string>
#include <map>
class Log {
public:
static Log* get_instance(std::string path);
protected:
Log(std::string path) : path(path), log(path) {};
std::string path;
std::ostream log;
private:
static std::map<std::string, Log*> instances;
};
std::map<std::string, Log*> Log::instances = std::map<std::string, Log*>();
Log* Log::get_instance(std::string path) {
if (instances[path] == nullptr) {
instances[path] = new Log(path);
}
return instances[path];
}
Одним из решений было быиспользовать что-то похожее на это где вы используете специальную функцию, предоставьте значение по умолчанию при проверкеmap
, Тем не менее, я понимаю, что это приведет к сложности поискаO(n)
вместоO(1)
, Это не слишком большая проблема в моем сценарии (было бы только несколько журналов), но лучшее решение было бы каким-то образом заставить указатели типаLog*
ссылатьсяnullptr
по умолчанию, делая проверку поискаO(1)
и портативный одновременно. Возможно ли это, и если да, то как бы я это сделал?