草庐IT

const_cast-ing

全部标签

c++ - OpenCV 摆脱了分配给 const 引用的麻烦?

我在openCV源代码中偶然发现了这段代码(cxoperations.hpp,第1134行,在Vector类的定义中):Vector(constVector&d,constRange&r){if(r==Range::all())r=Range(0,d.size());//somemorestuff...}请注意,Vector类没有名为r的数据成员(实际上,标识符r仅出现在整个类定义,作为另一个方法中的参数)。很显然,那是对const引用的赋值。我试图重现一个最小的例子:#includeclassFoo{public:int_a;Foo(inta):_a(a){}};intmain(){

c++ - 如何防止默认初始化具有类类型的 const 变量

我有一个自定义类,我希望它的行为像一个内置类型。但是我注意到您可以在不提供初始值的情况下初始化该类的常量变量。我的类当前有一个空的默认构造函数。这是int和我的类foo的比较:inta;//Validinta=1;//Validconstinta=1;//Validconstinta;//Errorfooa;//Validfooa=1;//Validconstfooa=1;//Validconstfooa;//Shouldcauseanerror,butitcompiles如你所见,我需要阻止constfooa;来自编译。C++专家有什么想法吗? 最佳答案

c++ - dynamic_cast 中的模糊转换

考虑获取对象作为参数并打印其类型的问题:#includeclassA{};classB:publicA{};classC:publicA{};classD:publicC,publicB{};usingnamespacestd;templatevoidprint_type(T*info){if(dynamic_cast(info))cout(info))cout(info))cout(info))cout它给我以下错误:“从派生类‘D’到基类的转换不明确。”但是我没看出歧义在哪里:如果main(d)中声明的对象是D类型,为什么不能直接转换为A类型呢?此外,如果我传递一个字符串类型的参数

C++:将 const char* 类型的字符串文字传递给字符串参数

我是C++的新手,不明白为什么这段代码运行良好:stringGetString(stringpromt){cout像“bla”这样的字符串文字是constchar*类型。至少autoi="bla";表示i的类型为“constchar*”。为什么可以将它传递给GetString-Function,因为该函数需要一个字符串而不是constchar*? 最佳答案 std::string有一个convertingconstructor它采用charconst*并使用指针指向的空终止字符串初始化字符串。此构造函数不是显式,因此可用于隐式转换。

c++ - 在 C 中通过 const 引用传递

C是否像C++一样支持通过const引用传递?如果不是,是否有其他方法可以使按值传递更有效?我认为仅仅因为效率更高就传递对函数的引用是没有意义的。 最佳答案 C不支持引用或通过引用传递。您应该改用指针并按地址传递。按值传递对于原始类型是有效的,但对于结构来说是浅拷贝。在C++中,通过引用传递对象以提高效率非常有意义。当定义复制构造函数时,它可以节省大量的构造函数/析构函数的复制和调用。对于大型数据对象(例如std::list),按值传递是不切实际的,因为传递时会复制列表。在这里你绝对应该通过引用传递。

c++ - 为什么不总是在 C++ 中通过 const 引用传递?

我知道当您想更改原始变量的值时,您会通过引用传递给C++中的函数。但是当您希望程序更高效并且不想更改传递给函数的变量中的任何内容时,您也可以通过引用传递,只需将其设为常量即可。我的问题是,为什么不总是让你的函数接受通过const引用传递的变量,如果它比仅仅传递变量并让编译器在函数范围内创建一个新变量更有效的话?要扩展这个问题,函数需要复制通过参数传递的变量的情况是什么? 最佳答案 当参数按值传递时,它是可修改的并且可以省略复制它。例如,实现赋值运算符的规范方式如下所示:T&T::operator=(Tvalue){value.swa

c++ - 将 dynamic_cast 与模板一起使用

在用C++实现基于模板的工厂时,我创建了以下allocator函数来实例化给定的子类:templateParentClass*allocator(){ChildClass*child=newChildClass();ParentClass*parent=dynamic_cast(child);if(NULL==parent){deletechild;returnNULL;}returnparent;}一切正常,但是当通过静态代码分析工具(如coverity)运行代码时,deletechild;行被标记为逻辑死代码。我进行运行时检查的原因是为了断言,ChildClass是从ParentC

c++ - strcmp 无法将 ‘std::string {aka std::basic_string<char>}’ 转换为‘const char*

这个问题在这里已经有了答案:strcmporstring::compare?(6个答案)关闭8年前。提前为问题的基本性质道歉。我正在尝试使用strcmp函数来测试两个字符串的匹配字符。我将问题简化为下面的简单代码:#include#includeusingnamespacestd;voidcompareStrings(string,string);intmain(){stringstring1="testString",string2="testString";compareStrings(string1,string2);return0;}voidcompareStrings(str

c++ - 不允许从 'const unsigned char *const *' 到 'const char *const *' 的 static_cast

我遇到的是我的编译器拒绝将我的unsignedchar指针转换为signedchar指针。我有一段时间感到困惑,因为我一直在使用static_cast来转换符号性最长的时间。然后我做了一点挖掘(好吧,不是很深。我做了一点挖掘!)尽管现在我明白了static_cast防止指针类型转换恰恰是为什么它是更安全和更好的转换方式(比可能调用实现定义行为或未定义行为的传统替代方法)的原因,我仍然不确定我应该为我的情况实际做什么。我这里调用的是签名为的OpenGLAPI函数voidglShaderSource(GLuintshader,GLsizeicount,constGLchar**string

c++ - 将 std::function<int(int)> 赋值给 std::function<const int&(const int& x)>

以下代码编译但在VC++2015(发行版)中产生未定义的输出和运行时错误othercompilers.#include#includeintmain(){std::functionf=[](intx){returnx;};std::functiong=f;std::cout为什么赋值g=f;是允许的? 最佳答案 考虑重写等效代码以避免lambda或std::function:intf(intx){returnx;}intconst&g(intconst&x){returnf(x);}这是一个结构良好的代码,尽管如此,它仍会返回一个对