"A reference may be bound only to an object",为什么"const int &ref = 3;"有效?
"A reference may be bound only to an object", why is "const int &ref = 3;" valid?
我刚开始学习c++。我在网上找到了一个建议:"用一本好书学习,它比youtube上的视频要好。"所以,由于我很有动力,我有时间用c++Primer第五版学习。
在这本书中,他们说:注意:"引用不是对象。相反,引用只是已经存在的对象的另一个名称。"
以及:"引用可能只绑定到对象,而不是绑定到文字或更通用的表达式的结果"
我知道:
int i = 3;
int &ri = i; // is valid: ri is a new name for i
int &ri2 = 2; // is not valid: 2 is not an object
然后我不明白为什么:
const int &ri3 = 2; // is valid
他们写道:"如果你从右到左阅读。"
好的,不是很复杂。我理解:我声明了一个名为ri3的变量,它是一个引用(当&在类型之后时是一个参考,当&在表达式中时是一种地址)到int类型的对象它是一个常数。
我想这已经解释过很多次了,但当我在论坛上搜索时,我发现复杂问题的复杂答案,但我仍然不明白。
谢谢你的帮助。
https://stackoverflow.com/a/7701261/1508519
不能将文字绑定到对非常数的引用(因为修改文字的值并不是一个使感觉)。但是,您可以将文字绑定到对const的引用。
http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
"常量"很重要。第一行是错误和代码由于f()返回一个临时对象(即右值),并且只有左值可以绑定到对非常数的引用。
为了便于说明,请参阅此答案。
非常量引用不能指向文字。
以下代码将产生错误。
错误:类型的非常量引用的初始化无效'双&'来自"双"类型的右值
#include <iostream>
double foo(double & x) {
x = 1;
}
int main () {
foo(5.0);
return 0;
}
这是Lightness的评论。
[C++11:5.1.1/1]:[..]字符串文字是一个左值;所有其他文字是prvalue。
和cppreference(向下滚动到rvalue (until C++11) / prvalue (since C++11)
):
prvalue("纯"右值)是一个表达式,用于标识临时对象(或其子对象)或是与任何对象
以下表达式是prvalues:
Literal (except string literal), such as 42 or true or nullptr.
它是有效的,因为数字文字实际上是常量。因此,只有当它是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"的引用