草庐IT

send_this_email

全部标签

c++ - 为什么 static_cast(*this) 到基类会创建一个临时拷贝?

我正在阅读EffectiveC++并遇到了这个例子:classWindow{//baseclasspublic:virtualvoidonResize(){...}//baseonResizeimpl...};classSpecialWindow:publicWindow{//derivedclasspublic:virtualvoidonResize(){//derivedonResizeimpl;static_cast(*this).onResize();//cast*thistoWindow,//thencallitsonResize;//thisdoesn'twork!.../

c++ - enable_shared_from_this - 空的内部弱指针?

我正在使用enable_shared_from_this然后从Base继承.尝试使用shared_from_this()时在Derived的构造函数(不是初始化列表),我得到一个异常。原来内部弱指针为空,并不指向this一点也不。这怎么可能发生?我的另一个用例完全可以正常工作。我什至不知道从哪里开始。我低头看了enable_shared_from_this的源码,在我看来,该指针始终为nullptr。 最佳答案 您不能在对象的构造函数中调用shared_from_this()。shared_from_this()要求对象由至少一个s

c++ - 内联 lambda 初始化程序可以捕获 'this' 指针吗?

内联成员初始化lambda可以捕获和使用this指针吗?structA{inta=42;intb=[this](){returnthis->a*4;}();};它是有效的C++11代码(根据规范)还是只是GCC扩展?如果有效,为什么在引用成员a时必须使用this->? 最佳答案 Isitvalidc++11code?没有。只有block范围内的lambda可以有捕获列表:C++115.1.2/9Alambda-expressionwhosesmallestenclosingscopeisablockscopeisalocallamb

c++ - 警告 C4996 : This function or variable may be unsafe -- compared to GCC on POSIX

我注意到MS编译器会为cstdlib函数(如getenv)发出“已弃用”警告。MS发明了自己的标准,例如_dupenv_s。问题1AFAIK主要的“不安全”事情是关于重入*。既然MS的CRT被标记为“多线程”(/MT),他们为什么不直接将getenv替换为可重入的线程安全版本呢?是否有人会依赖不安全的行为?问题2我用GCCg++-Wall-Wextra-Weff++-pedanticfoo.cpp编译了相同的代码,它不会产生任何警告。所以我想这在POSIX上不是问题吗?这是如何解决的?(好吧,也许他们只是改变了getenv的行为,很高兴能得到确认。*说它只是关于可重入性是一种过度概括。

c++ - 为什么即使在调试版本中,VS 和 Windbg 也会将 "this"指针打印为 "0xcccccccc"?

我尝试在进入成员函数时使用windbg打印“this”指针,如下所示。classIBase{intm_i;public:IBase():m_i(23){}virtualintFuncOne(void)=0;virtualintFuncTwo(void)=0;};classDerivedOne:publicIBase{public:virtualintFuncOne(void){return1;};//setbreakpointhere.virtualintFuncTwo(void){return2;};};classDerivedTwo:publicIBase{public:virtu

c++ - 应该从成员方法中调用 "delete this"吗?

我刚刚读到这篇article并希望得到人们的建议:问:deletethis;应该在成员方法中调用吗? 最佳答案 通常这是一个坏主意,但偶尔会有用。只要你delete后不使用任何成员变量是绝对安全的,只要调用该方法的客户端理解它就可以删除对象。当你的类使用引用计数时,这很有用的一个很好的例子:voidRef(){m_References++;}voidDeref(){m_References--;if(m_References==0){deletethis;}} 关于c++-应该从成员方法

c++ - 编译时出现错误 "fopen' : This function or variable may be unsafe.

这个问题在这里已经有了答案:fopendeprecatedwarning(10个回答)关闭8年前。编译时收到此错误:'fopen':Thisfunctionorvariablemaybeunsafe.Considerusingfopen_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.我是C++新手并打开CV,因此请帮助我摆脱这个错误。谢谢void_setDestination(constchar*name){if(name==NULL){stream=stdout;}else{stream=fopen(name,"w"

c++ - std::string 可以为右值 *this 重载 "substr"并窃取资源吗?

我突然想到,std::string的substr操作对于右值来说可能更有效,因为它可以从*这个。N3225的标准库包含以下std::string的成员函数声明basic_stringsubstr(size_typepos=0,size_typen=npos)const;可以为右值实现优化的substr的实现是否可以重载它并提供两个版本,其中一个可以为右值字符串重用缓冲区?basic_stringsubstr(size_typepos=0)&&;basic_stringsubstr(size_typepos,size_typen)const;我想右值版本可以如下实现,重用*this的内存

c++ - `*this` 可以是 `move()` d 吗?

我想定义一个用于编码数据的类;编码完成后,我想将编码的数据从其中move移出,这可能会使编码对象无效。我相信这可以通过下面的static函数extractData实现:classMarshaller{public:staticDataTypeextractData(Marshaller&&marshaller){returnstd::move(marshaller.data);}private:DataTypedata;}虽然这样调用有点不方便:Marshallermarshaller;//...dosomemarshalling...DataTypemarshalled_data{M

c++ - protected 成员是派生类中的 "not declared in this scope"

这个问题在这里已经有了答案:accessingprotectedmembersofsuperclassinC++withtemplates[duplicate](2个回答)关闭8年前。#include#includetemplateclassBase{protected:std::vectordata_;};templateclassDerived:publicBase{public:voidclear(){data_.clear();}};intmain(intargc,char*argv[]){Derivedderived;derived.clear();return0;}我无法编