c++用形参初始化引用
C++ initializing reference with a parameter
我有以下代码,我想知道为什么它写出"22"而不是垃圾
class example
{
public:
example(int ea) : ref(ea)
{
}
int& ref;
};
int main ()
{
example obj(22);
cout << obj.ref; // Writes out 22
return 0;
}
我认为这应该发生:
- obj(22)获得22到临时整数的隐式转换
- 整数被复制到int ea参数
- ref使用ea参数 的引用进行初始化。
- ea参数被销毁
为什么引用仍然有效?
简短的回答:这是无效的,它恰好工作。
长回答:你的事件顺序是正确的。引用指向已经超出作用域的变量(在构造函数的末尾)。因此,它是一个悬空引用。此后对该引用的任何使用都会显示未定义的行为。在本例中,它只是输出了值,但它也可以很容易地执行其他操作。
引用仍然无效,并且访问它所引用的内存会给出未定义的行为。对于您来说,它恰好指的是某个曾经包含值为22的整数的内存,并且尚未被重用。
它的未定义行为
试试下面的代码看看差异:
example obj(22);
example obj2(33);
example obj3(44);
cout << obj.ref; // <-- writes out 44 instead of 22
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖