【问题标题】:Define variable in namespace but get null value in test在命名空间中定义变量,但在测试中获得空值
【发布时间】:2019-07-08 23:34:52
【问题描述】:

我有一个 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");
}

然后在我的单元测试中,当我尝试使用 ObjectType 时,该值始终为 NULL:

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

我记得自从我将 struct 字段定义为 const 后,它应该会延长输入的生命周期。然后应该打印 sample1.value。但是它没有..任何人都知道它为什么会发生?谢谢!

【问题讨论】:

  • 修复识别请。这让我很焦虑。
  • @Justin 我不认为将某些东西放在命名空间中会使它成为临时的
  • @Kosta 没错,命名空间级别的全局变量不是临时的。但是,为构造全局变量而构造的std::strings 临时变量。
  • @user4581301 此处使用的隐式转换与建议的 dup 中使用的显式转换之间的差异非常小。

标签: c++ struct constructor constants lifetime


【解决方案1】:

这是未定义的行为。

const ObjectType sample1   (0, "sample1");

因为这个类的构造函数的参数是const std::string &amp;,所以这会从一个字符串字面量构造一个临时的std::string对象,将它传递给构造函数,当构造函数返回时临时对象被销毁。

构造函数将临时对象的引用保存为其类成员。不幸的是,临时对象在稍后被引用之前被销毁,导致未定义的行为。

这与命名空间无关。

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2016-02-25
    • 1970-01-01
    • 2020-02-19
    • 2011-05-28
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多