下面的结果是什么?它是格式错误、未定义的行为还是定义良好且格式正确的行为?structA{};std::pointer_traitsx;我之所以问,是因为好奇想知道,也想知道任意类型是不是指针。我还想包括shared_ptr和friend。我想知道是否有类型特征(谓词),如果没有,我是否可以使用pointer_traits并检测是否声明了element_type。 最佳答案 它表示从20.6.3p1开始格式错误,因为它没有element_type并且不是类模板实例化typedefseebelowelement_type;Type:P
我有以下代码,在VisualC++2012中编译。#includevoidfunc(std::stringstr){}voidmy_func(){func(false);}bool值“false”被隐式传递给字符串构造函数string(constchar*_Ptr)然后指针为空(因为false=0)。为什么会编译,是否应该按照C++11标准编译? 最佳答案 MSVC错误地将false视为空指针常量。然而,根据N4140,§4.10[conv.ptr]/1(强调我的):Anullpointerconstantisanintegerli
假设我们有以下代码:voidff(wchar_t*){}templatevoidffc(T&&a){ff(std::forward(a));}为什么允许调用ff(0),但不允许调用ffc(0)? 最佳答案 在ffc(0)的情况下T将被推断为int,因为0是一个整数文字,其类型为int并且即使没有转发,也没有从int到wchar_t*的有效隐式转换,因此以下情况也不会起作用:templatevoidffc_no_forward(T&&a){ff(a);}而在第一种情况下0是空指针常量,因此完全有效地转换为wchar_t*。从C++14
考虑一个模板类:templateclassProxy{voidrun(){ReturnTyperet=Fn();//...dosomething...}};//andafunctionsintfn1(){return5;}floatfn2(){return5;}这可以通过使用实例化:Proxyp1;但是显式声明返回值类型似乎是不必要的。我想要实现的是:someProxyInstantationp1;someProxyInstantationp2;不幸的是,我对c++没有任何期望,这似乎是该语言的一个隐藏角落(至少对我而言)。如果我可以从指向函数的指针获取它的类型——类似于:std::t
如果我想将dynamic_cast与shared_ptr一起使用,我可以使用dynamic_pointer_cast。如果我想转换auto_ptr,我该用什么?我假设如下所示。structB:A{};...auto_ptrbase(...);auto_ptrderive=dynamic_pointer_cast(base);我正在为shared_ptr使用boost 最佳答案 auto_ptrbase(...);if(B*query=dynamic_cast(base.get())){//takeownershipbase.rele
这个问题与此相关:"badcodegen,pointerdiff"linkererrorwithXcode4和"badcodegen,pointerdiffinboost"errorin32-bitbuild和XCode3.2.6and4linkererrorsld:badcodegen,pointerdiffin...toglobalweaksymbol我目前正在将我的所有项目升级到Xcode4,但我遇到了一些奇怪的事情。-仅当我构建通用二进制文件或32位版本时才会出现上述错误。如果我只坚持64位,一切正常。我正在自己构建一个自定义静态库,现在我不在该代码中使用任何可见性设置(即at
我正在使用C++来表示使用引用计数对象的大图。像这样的东西://PublicclassclassPointer{public://ConstructorsPointer(...){node=...;node->counter++;}//CopyconstructorPointer(Pointer&constother){node=other.node;node->counter++;}//Destructor~Point(){if(--node->counter==0)deletenode;}//Othermethods...Node*node;};//Nodebaseclasscla
所以我现在有点进退两难。我想做一个函数指针,但我想把它做成一个虚函数。不一定是虚函数本身,而是派生函数。我试着只制作指针,但函数需要是静态的。当我尝试创建静态虚函数时,编译器对我大喊大叫。我也不想使函数指针类特定,因此可以想象其他类可以使用该指针。这是我在伪代码中的意思:classC{public:virtualvoidsomething();};classB:publicC{public:voidsomething();};classD{public:voidsomething();};intmain(){void(*pointer)();Bb;Dd;pointer=b.someth
这是我为reinterpret_cast实验编写的代码#include#includeusingstd::cout;usingstd::endl;intfoo(){cout(foo);//Convertionafunctiontypetoapointertofunctiontypebar();//displaysfoo.IsitUB?}首先为什么这样reinterpret_cast允许转换?我认为这种转换是错误的。 最佳答案 Thestandard(C++11§5.2.10/6)说Apointertoafunctioncanbeex
我刚刚接到任务,将遗留应用程序从32位更新到64位。在审查任务的范围时,我在包含外部(例如平台)header之前立即发现了以下定义:#definePOINTER_32我找不到这个定义的用途或它有什么作用,但它看起来像是与我的任务直接相关的那种东西!它有什么用?它有什么用?立即移除它是否安全(我认为从长远来看有必要移除它)?这是使用MSVC++2008,即将成为2010。 最佳答案 这是一个通常在WindowsSDKheaderBaseTsd.hheader文件中声明的宏。在32位模式下编译时,它的定义如您所示。在64位模式下编译时定