Имеет ли stati c std :: map элемент в методе конструктора вызова класса? - PullRequest
0 голосов
/ 17 января 2020

У меня есть сомнение, у меня есть класс, мы можем сказать «a», у которого есть метод «b», который в теле устанавливает состояние c std :: map. Вопрос в следующем:

следующий код гарантирует, что конструктор std :: map вызывается? Или у нас неопределенное поведение?

ах

class a {
public:
    void b();
};

a. cpp

void a::b(){
    static std::map<int,int> mapB;
    bool notFound = mapB.find(0) == mapB.end();
    std::cout << "notFound: " << std::endl;
}

В моем случае этот код работает, и вывод:

notFound: 1

Но это правильно? Или это только случай неопределенного поведения?

Еще одно сомнение: если у меня есть карта с классом вместо базового c типа, это то же самое? Я сообщаю пример кода:

c .h

class c {
public:
    int i;
};

ах

class a {
public:
    void b();
};

а. cpp

void a::b(){
    static std::map<int,c> mapB;
    bool notFound = mapB.find(0) == mapB.end();
    std::cout << "notFound: " << std::endl;
}

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Да, конструктор выполняется при первом вызове b(). Это указывается в 8.8.4 :

Dynami c Инициализация переменной области блока с stati c продолжительностью хранения или продолжительностью хранения потока выполняется в первый раз контроль проходит через его декларацию; такая переменная считается инициализированной после завершения ее инициализации.

2 голосов
/ 17 января 2020

Но это правильно?

Да.

Или это только случай неопределенного поведения?

Инициализация по умолчанию нетривиального класса, такого как экземпляр стандартной карты, вызывает конструктор класса по умолчанию.

Еще одно сомнение: если у меня есть карта с классом вместо базового c типа, это то же самое?

Это не имеет значения для инициализации карты.

...