草庐IT

c++ - 显式复制构造函数编译错误

我在检查C++中的运算符重载时遇到了一些我没有预料到的事情,对此我有一些疑问。我的复制构造函数声明并实现为explicitVector(constVector&v);Vector::Vector(constVector&v):_x(v._x),_y(v._y),_z(v._z){}然后我重载了复合赋值运算符VectorVector::operator+(constVector&v)const{Vectortmp(*this);tmp+=v;returntmp;}VectorVector::operator-(constVector&v)const{Vectortmp(*this);tm

c++ - 何时以及如何默认初始化一个 const 变量?

clang++不允许defaultinitializationofaconstvariableofclass-typewithoutauser-definedconstructor;g++的限制稍微少一些(见下文)。根据thisanswer,这是因为POD类型“默认情况下未初始化”。如果我理解正确的话,这意味着默认初始化不会调用默认构造函数,也不会调用值初始化,因此POD类型中的数据成员不会被初始化。当然,其中包含未初始化值的constPOD类型是没有意义的,因为它们永远不会被初始化,因此使用起来不安全。这种情况有几种变体:技术上该类型是“POD”,但不包含数据成员(仅包含函数)。(c

c++ - 同时采用指向成员函数的指针和指向 const 成员函数的指针的函数

我有以下代码库:templateclassSomeClass{public:templatevoidregister_function(conststd::pairfct){autof=[fct](Params...params)->ReturnType{return(Type().*fct.second)(std::ref(params)...);}//...}};当我将指针传递给成员函数(非常量)时,这会起作用。但是,如果我想将指针传递给const成员函数,则会导致编译错误,我必须复制上述函数才能获得此代码:templateclassSomeClass{public:templat

c++ - 用户定义的转换函数和转换为引用

我遇到以下代码的编译错误:classSymbolGroup{std::stringd_;public:SymbolGroup(std::stringa):d_(a){}//explicitoperatorconststd::string&()const{returnd_;}//compilesexplicitoperatorstd::string()const{returnd_;}//Doesnotcompile};inlinebooloperator==(constSymbolGroup&lhs,constSymbolGroup&rhs){returnstatic_cast(lhs)

C++:const-从一个初始化函数初始化多个数据成员

我有一个带有两个数据成员的C++类,例如,classmytest(){public:mytest():a_(initA()),b_(initB()){};virtual~mytest(){};private:doubleinitA(){//somecomplexcomputation}doubleinitB(){//someothercomplexcomputation}private:constdoublea_;constdoubleb_;}不幸的是,initA和initB不能如上图所示分开。a_和b_都可以通过一次复杂的大计算来初始化,其中b_的值取决于计算的中间结果>a_,例如,

c++ - C++ 临时对象的生命周期是在什么时候创建的? : expression extended by binding it to a local const reference?

我不清楚是否可以通过将临时对象绑定(bind)到?:表达式中的常量引用来延长临时对象的生命周期:classFoo{...};Foo*someLValue=...;constFoo&=someLValue?*someLValue:Foo();通过调用默认构造函数Foo()创建的临时对象的生命周期是否通过将其绑定(bind)到本地constref来延长,即使绑定(bind)是有条件的?还是因为Foo()的临时值会在?:表达式的末尾被销毁,所以这会创建一个悬空引用? 最佳答案 在此代码中,条件运算符的第二个和第三个操作数具有不同的值类别(

c++ - OpenCV - 如何从 uint8_t 指针创建 Mat

我有以下C++代码:voidfoo(constuint8_t*data,intheight,intwidth){//needtocreateacv::Matfrom*data,whichisapointertograyscaleimagedata//doesn'tworkcorrectly(compiles,butarrayaccessonthematleadstoasegmentationfault)autoimg=cv::Mat(height,width,CV_8UC1,&data);//howcanIfixthelineabovetocreateapropercv::Mat?}/

c++ - 通过传递 const char* 隐式选择字符串模板

假设我有我的自定义字符串类:classmy_string:publicstd::string{//...}我想制作一个模板化函数,它接受my_string两者。默认情况下:templateTStringdo_something(constTString&input){//...}但是当我调用它时:autoresult=do_something("abcdef");它调用(当然)do_something().如何强制它调用do_something没有明确指定类型(即写do_something("abcdef"),而不是do_something("abcdef"))?

c++ - 与 const 枚举值 0 匹配的 MSVC 函数

我被MSVC意外的C++函数匹配所困扰。我可以将其简化为以下测试用例:#includeenumCode{aaa,bbb};structMyVal{Codec;MyVal(Codec):c(c){}};voidtest(inti,MyValval){std::cout我预计test的所有7次调用都将匹配第一个重载,并且GCC(liveexample)和Clang(liveexample)按预期匹配:case1:value0case2:value0case3:value1case4:value0case5:value0case6:value0case7:value1但MSVC(liveex

c++ - 有没有办法拥有一个公共(public)成员,从类外部不可修改,没有访问器包装函数?

据我所知,这似乎不可能以直接的方式进行。使成员const使它对每个人都是const。我想要一个只读属性,但想避免使用典型的“getter”。我想要constpublic,mutableprivate。这在C++中完全可行吗?目前我能想到的只是一些模板和friend的诡计。我现在正在调查这个。这似乎是一个愚蠢的问题,但我之前对这里的答案感到惊讶。 最佳答案 一个可能的解决方案可以基于一个内部类,外部类是它的友元,如下所示:structS{templateclassProp{friendstructS;Tt;voidoperator=(