Определить переменную в пространстве имен, но получить нулевое значение в тесте - PullRequest
0 голосов
/ 09 июля 2019

У меня есть вопросы на C ++, которые я хочу задать.

В заголовке я определил структуру следующим образом:

struct ObjectType
{
    const int                                 id;
    const std::string&                        value;

    ObjectType(const int id, const std::string& value = ""):
                    id     (id)
                  , value  (value)
{

}

};

В анонимном пространстве имен я определил три переменные:

namespace {
    const ObjectType sample1   (0, "sample1");
    const ObjectType sample2   (1, "sample2");
    const ObjectType sample3   (2, "sample3");
}

Затем в моем unittest, когдаЯ пытаюсь использовать ObjectType, значение всегда будет NULL:

TEST(TestClass, test01)
{
   std::cout << sample1.value << std::endl; // => This is always empty
}

Как я помню, поскольку я определил поле структуры как const , оно должно расширятьсявремя жизни входа.Затем sample1.value должно быть напечатано.Однако это не так. Кто-нибудь знает, почему это происходит?Спасибо!

1 Ответ

3 голосов
/ 09 июля 2019

Это неопределенное поведение.

const ObjectType sample1   (0, "sample1");

Поскольку параметром для конструктора этого класса является const std::string &, это создает временный объект std::string из строкового литерала, передает его конструктору, и когда конструктор возвращает временный объект, он уничтожается.

Конструктор сохраняет ссылку на временный объект в качестве члена класса. К сожалению, временный объект уничтожается до того, как на него ссылаются позже, что приводит к неопределенному поведению.

Это не имеет ничего общего с пространствами имен.

...