将 double 分配给 const int&vs int to const int&
Assigning double to const int& vs int to const int&
我试图理解C++中的常量引用,我偶然发现了这个问题:
当我将 double 分配给 const int&,然后更改引用双精度的值时,我的 int 引用的值保持不变。
double i = 10;
const int &ref = i;
i = 20;
cout << "i: " << i << endl; // i = 20
cout << "&ref: " << ref << endl; // ref = 10
而在分配 int 时,值会发生变化。
int i = 10;
const int &ref = i;
i = 20;
cout << "i: " << i << endl; // i = 20
cout << "&ref: " << ref << endl; // ref = 20
这种行为的原因是什么?我的猜测是,在分配 double 时,对 int 的隐式转换会创建一个新对象,然后分配它的引用,但我在任何地方都找不到它写下来。
看起来像,但ref
也不是对i
的引用。
double i = 10;
const int &ref = i; // ***
i = 20;
对int
的引用不能引用double
。因此,在标记的行中,发生了从double
到int
的转换,转换的结果是临时右值。通常,当它们被创建的完整表达式结束时,它们会被破坏。但是C++中有一条规则,允许在临时绑定到对const
的引用时延长其生存期。它被扩展,直到引用死亡。为此,编译器实际上在后台为其分配了一些内存。
赋值修改原始对象i
,未命名的临时对象保持不变。
当你将double
转换为int
时,结果是类型为 int
的右值。此临时值绑定到常量引用变量,因此临时值的生存期将延长为引用变量的生存期。更改原始double
对此没有影响。
只有当您从两个声明中删除const
并尝试编译代码片段时,编译器才能为您提供很多帮助:
double i = 10;
/*const*/ int &ref = i; //ERROR - WHY?
此代码将给出编译错误!为什么?
但是这个代码:
int i = 10;
/*const*/ int &ref = i; //NO ERROR
将编译正常。
如果第一个代码在有const
时编译正常,为什么现在不编译(当const
不存在时(?引擎盖下发生了什么?
好吧,原因是,实际上int&
是一个引用类型,它只能引用类型int
的对象,而不是double
,所以从表达式i
(这是double
(创建一个类型int
的临时对象,但临时对象不能绑定到int&
,所以它给出了编译错误, 但是一旦你把const
放在那里,它就可以很好地编译,因为 int
类型的临时对象可以绑定到 const int&
.
在第二个代码中没有发生这样的事情 — 没有创建临时对象。因此,当您将i
设置为 20
时,ref
在第二种情况下也会更改(因为它指的是i
(,但在第一种情况下,当您将i
设置为 20
时,ref
不会更改,因为ref
不再引用i
- 而是引用临时对象(您不会更改!这解释了代码片段的行为。
希望有帮助。
double i = 10;
const int &ref = i;
根据您使用此代码的编译器,也可能给出编译错误。
在抛出错误的编译器上,如果将其转换为 (int &)
,您将看到未定义的行为,因为您正在从双精度的位置读取 int。在接受这一行的编译器上,我最好的猜测是它正在创建一个临时变量(右值(并分配给 int 引用,对原始变量的任何更改都不会反映在引用中。
要使引用正常工作,请确保源数据类型可以由目标数据类型表示。
你可以把 int 想象成一个类,int(double(;作为从双精度构造 int 的一种方式,你有一个对那个 int 的 const 引用,它是从双精度构造的。
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 在C++中,如果"int a = 3; int* p = &a;",那么为什么不允许"const int* &pp = p",但允许"const int* const &pp = p"?
- 调用'myStud::myStud(int, const char [5], int, int, int)'没有匹配函数
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- int(int)& 或 int(int) const &是什么类型?
- 传递 const int* 和 int* 时调用重载函数的不同版本(const int* const&/&&)
- 如何在构造函数中初始化int const * const
- 对"displayForStudent(int, int const*, double const*, int)"的未定义引用 collect2.exe:错误:ld 返回 1 个退出状态
- 如何在 C++ 中解释"const int *const & variable"
- 为什么"int & const" MSVC 编译得很好?
- const int const&和const int&in C++有什么区别?
- std::set<int * const> 不会编译
- " invalid operands of types 'int' and 'int* const'" 来自功能的错误,来自书
- std::initializer_list<int const> 不能从 std::initializer_list <int>构造
- 对'std::string Helper::ToString<int>(int const&)'的未定义引用
- 无法弄清楚 int[3][3] 和 int(* const)[3] 之间的区别
- const int* const fun(const int* const& p) const的含义;
- 为什么vector<int * const>是非法/不合逻辑的?
- 对 Stack<int>::p ush(int const&) 的未定义引用
- JsonCpp:未定义的对"Json::Value::operator[](int) const"的引用