为什么传递const std :: string&一个构造函数不允许你将它绑定到const std :: string&初始化列表中的成员变量?

时间:2018-03-23 13:39:33

标签: c++ string constructor reference const

好的,我在这里发生了一件奇怪的事。 (至少我认为这很奇怪,但我可能会犯一个根本性的错误)

所以,我有一个像这样的构造函数:

Module(const std::string& name) : m_name(name)
        {
            std::cout<<"Module String Constructor"<<std::endl;
            std::cout<<"Constructed with name "<<m_name<<std::endl;
        }

成员变量m_name如下所示:

 const std::string& m_name;

我已经验证了构造函数被调用,并且m_name与这些控制台输出一起正确设置。

但是,当我尝试在将来某个时候使用以下方法检索名称时:

 inline const std::string& GetName()
        {
            return m_name;
        }

我得到一个零长度的空对象。

我可以通过从成员变量

中删除 const &amp; 说明符来使其正常工作

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

  

但是我不能用字符串文字调用构造函数。

如果从字符串文字初始化对象,则将使用临时std::string传递给Module的构造函数。临时可以绑定到lvalue-reference-to-const,但它会在整个表达式之后立即销毁,之后成员引用m_name变为悬空。从Module::GetName()获取它并取消引用它会导致UB。

您可以使用命名变量来初始化对象;你还需要注意变量的生命周期。或者停止使用会员参考。