草庐IT

const_buffers

全部标签

c++ - 在非常量对象上,为什么 C++ 不调用具有 public-const 和 private-nonconst 重载的方法的 const 版本?

classC{public:voidfoo()const{}private:voidfoo(){}};intmain(){Cc;c.foo();}MSVC2013不喜欢这样:>errorC2248:'C::foo':cannotaccessprivatememberdeclaredinclass'C'如果我转换为const引用,它可以工作:const_cast(c).foo();为什么我不能在非const对象上调用const方法? 最佳答案 对象不是const,所以非const重载是更好的匹配。重载解决发生在访问检查之前。这可确保重

c++ - 在类的函数中使用 'const'

这个问题在这里已经有了答案:Meaningof'const'lastinafunctiondeclarationofaclass?(12个回答)关闭5年前.我在类中看到了很多将const关键字放在函数后面的用法,所以我想知道它是关于什么的。我在这里阅读了smth:http://duramecho.com/ComputerInformation/WhyHowCppConst.html.它说使用const是因为函数“可以尝试更改对象中的任何成员变量”。如果这是真的,那么它应该在任何地方使用,因为我不希望以任何方式更改或更改任何成员变量。classClass2{voidMethod1()co

c++ - 在类的函数中使用 'const'

这个问题在这里已经有了答案:Meaningof'const'lastinafunctiondeclarationofaclass?(12个回答)关闭5年前.我在类中看到了很多将const关键字放在函数后面的用法,所以我想知道它是关于什么的。我在这里阅读了smth:http://duramecho.com/ComputerInformation/WhyHowCppConst.html.它说使用const是因为函数“可以尝试更改对象中的任何成员变量”。如果这是真的,那么它应该在任何地方使用,因为我不希望以任何方式更改或更改任何成员变量。classClass2{voidMethod1()co

c++ - 在 C++ 中,C 风格的强制转换可以调用转换函数然后抛弃 const 吗?

GCC和Clang都拒绝以下代码中的C风格转换。http://coliru.stacked-crooked.com/a/c6fb8797d9d96a27structS{typedefconstint*P;operatorP(){returnnullptr;}};intmain(){int*p1=const_cast(static_cast(S{}));int*p2=(int*)(S{});}main.cpp:Infunction'intmain()':main.cpp:7:25:error:invalidcastfromtype'S'totype'int*'int*p2=(int*)(

c++ - 在 C++ 中,C 风格的强制转换可以调用转换函数然后抛弃 const 吗?

GCC和Clang都拒绝以下代码中的C风格转换。http://coliru.stacked-crooked.com/a/c6fb8797d9d96a27structS{typedefconstint*P;operatorP(){returnnullptr;}};intmain(){int*p1=const_cast(static_cast(S{}));int*p2=(int*)(S{});}main.cpp:Infunction'intmain()':main.cpp:7:25:error:invalidcastfromtype'S'totype'int*'int*p2=(int*)(

c++ - 将 const 限定符应用于模板参数时的不同编译器行为

考虑以下示例(godbolt):#includetemplateconstT*as_const(T*p){returnp;}voidf(){}templatevoidg(T*){std::coutvoidg(constT*){std::coutGCC和Clang都可以编译它,但生成的可执行文件会产生不同的输出:用GCC编译的版本打印A,而用Clang编译的版本打印B。你能解释一下这个区别吗?更新:正如@VTT所指出的,即使as_const被删除,也会观察到相同的差异。 最佳答案 您似乎遇到了尚未解决的标准缺陷。所以回答“哪个编译器是

c++ - 将 const 限定符应用于模板参数时的不同编译器行为

考虑以下示例(godbolt):#includetemplateconstT*as_const(T*p){returnp;}voidf(){}templatevoidg(T*){std::coutvoidg(constT*){std::coutGCC和Clang都可以编译它,但生成的可执行文件会产生不同的输出:用GCC编译的版本打印A,而用Clang编译的版本打印B。你能解释一下这个区别吗?更新:正如@VTT所指出的,即使as_const被删除,也会观察到相同的差异。 最佳答案 您似乎遇到了尚未解决的标准缺陷。所以回答“哪个编译器是

c++ - 结构化绑定(bind)中的 const 引用是否会延长分解对象的生命周期?

写constauto&[a,b]=f();是否保证延长从f()返回的对象的生命周期,或者至少是对象a和b是绑定(bind)的吗?通读theproposal我没有在语言中看到任何明显的东西来确保它确实如此,除非它只是被其他东西所覆盖。但是,以下内容不会延长临时的生命周期,所以我看不出它会如何被覆盖:constauto&a=std::get(f());在论文的顶部,它似乎暗示它已被覆盖thecv-qualifiersandref-qualifierofthedecompositiondeclarationareappliedtothereferenceintroducedfortheini

c++ - 结构化绑定(bind)中的 const 引用是否会延长分解对象的生命周期?

写constauto&[a,b]=f();是否保证延长从f()返回的对象的生命周期,或者至少是对象a和b是绑定(bind)的吗?通读theproposal我没有在语言中看到任何明显的东西来确保它确实如此,除非它只是被其他东西所覆盖。但是,以下内容不会延长临时的生命周期,所以我看不出它会如何被覆盖:constauto&a=std::get(f());在论文的顶部,它似乎暗示它已被覆盖thecv-qualifiersandref-qualifierofthedecompositiondeclarationareappliedtothereferenceintroducedfortheini

c++ - 为什么现在 "{static const char a[]={...}"和 "{const char a[]={...}"之间存在差异?

看看Ccode的这个小片段或C++code在神bolt上……voidb(charconst*c);voida(void){charconstz[]={0xd,0xe,0xa,0xd,0xb,0xe,0xe,0xf,0xa};b(z);}voidc(void){staticcharconstz[]={0xd,0xe,0xa,0xd,0xb,0xe,0xe,0xf,0xa};b(z);}早期版本的gcc将a()和c()都编译成两条指令,加载z的地址,跳转到b。我尝试将所有现代编译器“悲观”a()以“制作堆栈帧,将z复制到堆栈上,调用b,拆除堆栈帧,但将c()保留为两个指令的简单版本。实际上