C++ c++;变量赋值使代码工作

C++ c++;变量赋值使代码工作,c++,visual-c++,constructor,variable-assignment,C++,Visual C++,Constructor,Variable Assignment,我有一门课: 寄存器.h #pragma once #include <string> class Register { public: Register(const std::string& name); void printName(); private: const std::string& m_name; }; 我希望它会打印两次“A”,但它会打印一次“A”和一次“A”。请告诉我这两个选项之间的区别,以及如何让第二个选项工作,因为

我有一门课: 寄存器.h

#pragma once
#include <string>

class Register {
public:
    Register(const std::string& name);
    void printName();

private:
    const std::string& m_name;
};
我希望它会打印两次“A”,但它会打印一次“A”和一次“A”。请告诉我这两个选项之间的区别,以及如何让第二个选项工作,因为在创建
reg
的函数中,我没有使用
name
的任何其他位置

Register reg2("A");
隐式创建一个临时的
std::string
实例,并从中初始化引用成员变量:

const std::string& m_name;

Register::Register(const std::string& name) : m_name(name) {
}
临时实例的生存期在构造函数调用后结束,之后会有一个悬空引用,访问它是未定义的行为

变量的初始化可确保只要变量在范围内且处于活动状态,引用就有效


要解决该问题,只需将
m_name
成员变量设置为正常的
字符串
,而不是
const
引用

std::string m_name;

没有足够的信息说明为什么第二个版本不能同样好地工作。你能提供一个复制你声称的行为的例子吗?什么是
m_name
?参考文献:/?@πάνταῥεῖ, 我已经更新了问题,添加了更好的example@ComputerBackup在
寄存器reg2(“A”)之后
m_name
包含一个悬空引用(对已销毁对象的引用),并且以任何方式使用这种引用都会调用未定义的行为。@ComputerBackup构造函数参数的
常量字符串&
很好,但您的成员变量应该是一个简单的
std::string
const std::string& m_name;

Register::Register(const std::string& name) : m_name(name) {
}
std::string m_name;