草庐IT

c++ - 在 std::map 中使用 std::reference_wrapper

我以为maps和reference_wrappers会很容易,但我被一些奇怪的东西绊倒了:#include#includeintmain(void){std::map>mb;constinta=5;mb[0]=std::cref(a);}这段代码给我以下编译器错误:Infileincludedfromc:/MinGW/x86_64-w64-mingw32/include/c++/bits/stl_map.h:63:0,fromc:/MinGW/x86_64-w64-mingw32/include/c++/map:61,from../test/main.cpp:9:c:/MinGW/x8

c++ - 我无法理解的简单 lambda 函数

我正在学习使用const的C++14lambda,今天我的friend向我展示了以下内容。我听不懂。它是lambda函数吗?语法与我通常看到的不符。它的语法与lambda函数匹配,但失败并出现长错误。intmain(){//1.constautox=[&]{autol=0;l=99;returnl;}();std::cout我想知道1是什么,为什么2编译失败。 最佳答案 Iwantedtoknowwhatis1.andwhy2.failstocompile.(1)constautox=[&]{autoconst_val=0;cons

c++ - 使用(float&)int可以进行类型修剪,(float const&)int可以像(float)int那样转换吗?

VS2019版本x86。templatefloatget()const{intf=_mm_extract_ps(fmm,i);return(floatconst&)f;}当使用return(float&)f;编译器使用时extractpsm32,...movssxmm0,m32。正确的结果当使用return(floatconst&)f;编译器使用时extractpseax,...movdxmm0,eax。错误的结果T&和Tconst&首先是T,然后是const的主要思想。const只是程序员的某种协议(protocol)。您知道您可以解决它。但是汇编代码中没有任何const,只能输入f

c++ - 当字符串超出范围时,将 string::c_str() 分配给 const char*

我对基本的C++用法有疑问。下面的代码使用gcc/LInux编译,打印正确。字符串test超出范围,所以它的c_str()值也应该无效,不是吗?我错了还是我误解了constchar*的意思?#includeintmain(){constchar*a="aaaa";std::cout 最佳答案 你是对的,你的代码无效,因为它使用了一个生命周期已经结束的对象。它是“偶然”起作用的,你不能依赖它。 关于c++-当字符串超出范围时,将string::c_str()分配给constchar*,我们

c++ - 从 const 方法调用成员的非常量方法

我很惊讶地发现“常量”中的这个“洞”:#includeclassA{intr;public:A():r(0){}voidnonconst(){puts("Iaminurnonconstmethod");r++;}};classB{Aa;A*aPtr;public:B(){aPtr=newA();}voidgo()const{//a.nonconst();//illegalaPtr->nonconst();//legal}};intmain(){Bb;b.go();}所以基本上从const方法B::go(),你可以调用non-const成员函数(恰如其分地命名为nonconst())如果

c++函数语法/原型(prototype) - 括号后的数据类型

我非常熟悉C/C++标准函数声明。我最近看到这样的事情:intmyfunction(charparameter)const以上只是一个假设的例子,我什至不知道它是否有意义。我指的是参数之后的部分。常数。这是什么?一个更真实的例子:wxGridCellCoordsArrayGetSelectedCells()const这个可以查到here那么行尾的文本const到底在做什么? 最佳答案 const表示该函数不会更改this的任何数据成员,除非它们被标记为可变。只有成员函数可以标记为const,这意味着函数内部不会更改任何成员。

c++ - 非静态常量数据成员有什么意义?

这个问题在这里已经有了答案:Whenisanon-staticconstdatamembermoreusefulthanaconststaticone?(2个答案)关闭7年前。对于下面的代码:classA{public:constintcx=5;};在这里,将为A的每个对象创建一个cx的实例。这对我来说似乎是一种浪费,因为cx永远无法修改。实际上,我看不出编译器为什么不强制将const数据成员设为静态的任何理由。谁能给我解释一下吗?

c++ - 这个 C++ const 引用访问器接口(interface)习惯用法有什么问题吗?

我正在将一个结构体转换为一个类,这样我就可以为我的变量强制执行一个setter接口(interface)。不过,我不想更改所有读取变量的实例。所以我转换了这个:structfoo_t{intx;floaty;};为此:classfoo_t{int_x;float_y;public:foot_t():x(_x),y(_y){set(0,0.0);}constint&x;constfloat&y;set(intx,floaty){_x=x;_y=y;}};我对此很感兴趣,因为它似乎模拟了C#的公共(public)只读属性的想法。编译正常,我还没有发现任何问题。除了在构造函数中关联const

c++ - 从 "this"抛弃常量然后更改成员值会调用未定义的行为吗?

回应我对一些answerinanotherquestion的评论有人建议像voidC::f()const{const_cast(this)->m_x=1;}调用未定义的行为,因为const对象被修改。这是真的?如果不是,请引用允许这样做的C++标准(请说明您引用的标准)。为了它的值(value),我一直使用这种方法来避免使成员变量mutable如果只有一个或两个方法需要写入它(因为使用mutable使其对所有方法可写。 最佳答案 (尝试)修改const对象(C++11中的7.1.6.1/4)是未定义的行为。所以重要的问题是,什么是常

c++ - 无法在 C++ 中调用 const 引用参数的方法

classA{public:A(){};~A(){};voidmethod(){};};voidcall(constA&a){a.method();//IcannotcallthismethodhereifIuse"const"butIcancallitifnotusing"const"}intmain(){Aa;call(a);return0;}在这种情况下,错误是:“将constA作为voidA::method()的参数传递会丢弃限定符[-fpermissive]|”在函数call中,如果我使用const,我会得到错误,但如果我去掉它,它就会工作。谁能帮我解释一下?