草庐IT

const-ref

全部标签

c++ - 返回引用的 const 方法

classFoo{intBar;public:int&GetBar()const{returnBar;}}GetBar是const方法可以吗?它实际上并没有改变任何东西,但它为“外部世界”提供了一种改变它的方法。 最佳答案 您的代码中有错字,这可能是您的意思:classFoo{intBar;public:int&GetBar()const{returnBar;//Removedtheampersand,becauseareferenceisreturned,notanaddress}}不,这是不合法的。当用const标记方法时,你不

c++ - 返回引用的 const 方法

classFoo{intBar;public:int&GetBar()const{returnBar;}}GetBar是const方法可以吗?它实际上并没有改变任何东西,但它为“外部世界”提供了一种改变它的方法。 最佳答案 您的代码中有错字,这可能是您的意思:classFoo{intBar;public:int&GetBar()const{returnBar;//Removedtheampersand,becauseareferenceisreturned,notanaddress}}不,这是不合法的。当用const标记方法时,你不

c++ - 通过 const 指针修改用 new 创建的对象是否合法?

所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案

c++ - 通过 const 指针修改用 new 创建的对象是否合法?

所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案

c++ - 将 0 int 文字发送到 const 字符串参数时发生访问冲突

在VS2015和VS2017上,编译时没有警告,并生成无法捕获的访问冲突并使应用程序崩溃。显然int0被静默转换为空指针,然后假定它指向一个字符串,因此崩溃。#include#includevoidcrash(conststd::string&s){}intmain(){try{crash(0);}catch(conststd::exception&ex){//nevergetshere!std::cout如何捕获此类异常并从中恢复?如果我从函数参数中删除const它不会编译-所以这可能是防止用户滥用的一种方法,但我会失去const提供的保护,还是会?编写避免此问题的原型(protot

c++ - 将 0 int 文字发送到 const 字符串参数时发生访问冲突

在VS2015和VS2017上,编译时没有警告,并生成无法捕获的访问冲突并使应用程序崩溃。显然int0被静默转换为空指针,然后假定它指向一个字符串,因此崩溃。#include#includevoidcrash(conststd::string&s){}intmain(){try{crash(0);}catch(conststd::exception&ex){//nevergetshere!std::cout如何捕获此类异常并从中恢复?如果我从函数参数中删除const它不会编译-所以这可能是防止用户滥用的一种方法,但我会失去const提供的保护,还是会?编写避免此问题的原型(protot

c++ - 带有 const int* const 的 scanf 有效,但不应该

我的代码相当于以下内容:constint*constn=newint;printf("input:");scanf("%d",n);deleten;现在,由于n是一个指向CONSTANT整数的指针,这应该不起作用(我期待编译器错误)。但是,这似乎可以正常工作,甚至将输入的值存储到*n中。我想知道,为什么这不会给我一个错误;为什么它起作用?scanf不应该不能改变*n的值吗? 最佳答案 scanf的原型(prototype)是:intscanf(constchar*format,...);省略号表示它接受可变参数。C(和C++)没有办

c++ - 带有 const int* const 的 scanf 有效,但不应该

我的代码相当于以下内容:constint*constn=newint;printf("input:");scanf("%d",n);deleten;现在,由于n是一个指向CONSTANT整数的指针,这应该不起作用(我期待编译器错误)。但是,这似乎可以正常工作,甚至将输入的值存储到*n中。我想知道,为什么这不会给我一个错误;为什么它起作用?scanf不应该不能改变*n的值吗? 最佳答案 scanf的原型(prototype)是:intscanf(constchar*format,...);省略号表示它接受可变参数。C(和C++)没有办

c++ - 为什么 const int& 可以绑定(bind)到 int?

在C++入门中,我发现constint&可以与int对象绑定(bind)。我不明白,因为我认为constint&应该绑定(bind)constint不是int对象,int对象可以改变,这本书解释了这个问题,当constint&对象与int绑定(bind);两者之间有一个临时对象,例如:inta=0;constint&r=a;我们可以使用b作为临时值,所以上面等于:constintb=a;constint&r=b;但是我觉得这本书是不对的,因为如果在a和r之间存在一个像b这样的临时,那么值r不能改,但是我在visualstudio中调试下面的编码,发现不对:inta=0;constint

c++ - 为什么 const int& 可以绑定(bind)到 int?

在C++入门中,我发现constint&可以与int对象绑定(bind)。我不明白,因为我认为constint&应该绑定(bind)constint不是int对象,int对象可以改变,这本书解释了这个问题,当constint&对象与int绑定(bind);两者之间有一个临时对象,例如:inta=0;constint&r=a;我们可以使用b作为临时值,所以上面等于:constintb=a;constint&r=b;但是我觉得这本书是不对的,因为如果在a和r之间存在一个像b这样的临时,那么值r不能改,但是我在visualstudio中调试下面的编码,发现不对:inta=0;constint