草庐IT

c++ - 根据作用域或非作用域枚举的隐式实例化

14.7.3/6说明如下:Ifatemplate,amembertemplateorthememberofaclasstemplateisexplicitlyspecializedthenthatspecializationshallbedeclaredbeforethefirstuseofthatspecializationthatwouldcauseanimplicitinstantiationtotakeplace,ineverytranslationunitinwhichsuchauseoccurs;nodiagnosticisrequired.Iftheprogramdoes

c++ - 使用 std::initializer_list 的显式构造函数和初始化

classP{public:explicitP(inta,intb,intc){std::cout我认为{77,5,42}具有std::initialization_list的隐式类型.如果是这种情况,是什么原因导致变量z的构建失败?? 最佳答案 Ithink{77,5,42}hastheimplicittypeofstd::initialization_list{77,5,42}本身没有类型。如果你写autox={77,5,42}然后x类型为initializer_list.您的示例类型P有一个明确的构造函数。实际上,这意味着您必

c++ - 显式模板特化的语法

当编译为C++98或C++11时,gcc-4.9.2和clang-3.8都接受以下内容,#includetemplatevoidf(T){printf("T\n");}templatevoidf(int){printf("int\n");}//explicitspecializationtemplatevoidf(double){printf("double\n");}//explicitspecialization--14.7.2(7)templatevoidf(float){printf("float\n");}//HEREintmain(){f(1L);//Tf(10);//in

c++ - 在 C++ 中防止整数 0 隐式转换为指针的最佳方法是什么

我正在尝试找出防止整数0隐式转换为nullptr_t然后传递给采用指针的构造函数的最佳方法。Explicit不会这样做,但我可以让nullptr_t导致模棱两可的重载错误:#includestructA{explicitA(char*){}};structB{B(nullptr_ta)=delete;B(char*){}};intmain(intargc,char*argv[]){Aa(0);//darnitIcompiled...Bb1(0);//good,fails,butwithonlyb/cambiguousBb2((char*)0);//good,succeedsBb3(1)

c++ - C++ 中干净、功能性的脚本式错误处理

这是一个有趣的挑战。我想创建一些样板,允许使用类似于perl的x或die("reason")方法的语法干净地处理前提条件失败。我想到了这个删除器:structdo_exit{[[noreturn]]voidoperator()(void*)constnoexcept{std::exit(code_);}intcode_;};我们可以使用它来管理可能指向std::cerr的临时std::unique_ptr的“删除”:structexit_stream{exit_stream(intcode,std::ostream&os):stream_(std::addressof(os),do_e

c++ - 模板的显式特化

这是我的函数模板templateconstT&min(constT&a,constT&b){return(a函数的唯一目的是返回两个参数的最小值。参数是只读的..这里是char*参数的显式特化//Code1:templateconstchar*&min(constchar*&a,constchar*&b){return(strcmp(a,b)即使具有只读参数,此代码也会出错。虽然下面的代码完美运行//Code2:templateconstchar*const&min(constchar*const&a,constchar*const&b){return(strcmp(a,b)为什么我必

c++ - 从不同的库中隐式转换相似类型以在 C++ 中无缝地协同工作

我正在使用GLM和BulletPhysics,它们都有自己的vector类型-glm::vec3和btVector3。它们是完全相同的数据结构,但它们让我很烦,因为它们不能很好地结合在一起。必须进行大量手动转换。假设我有一个函数foo(btVector3f)并且我想传递一个glm::vec3作为参数而不用将它转换为btVector3,类似于将constchar*传递给需要std::string的函数,而不必先将其转换为字符串。现在我不想进入这些库中的每一个并手动将operator放入类中,只是为了在我更新库时破坏它(假设他们甚至允许这样做)执照)。我如何在我自己的项目中使一种类型的ve

c++ - 显式调用 `operator new` 后无法访问对象的函数

我正在做一个项目,我必须实现newoperator和deleteoperator,并通过我自己的MemoryManager管理我的内存-它有可用内存列表.为了分配我的列表和节点(不需要管理),我应该在调用malloc之后显式调用operatornew。当我尝试调用一个函数-setNext()时,它抛出异常:Exception:EXC_BAD_ACCESS(code=1,address=0x0)创建链表的哈希表:MyHashTable::MyHashTable(size_tmemorySize,void*startingPtr):size(getLowerLog(memorySize)+

c++ - 如何强制编译器显示隐式构造函数

gcc或clang有“-E”选项来运行预处理器并显示所有宏是如何展开的,对于隐式生成的方法我需要这样的东西。有没有办法强制gcc或clang为每个类打印隐式创建和删除的构造函数/析构函数/赋值运算符? 最佳答案 您可以使用模板类型特征作为从某些类型中提取此类信息的变通方法。这无法区分某些内容是被显式删除还是隐式删除,但是您可以肯定地知道您是否没有显式删除,例如#include#includestructA{A(constA&)=delete;};intmain(){std::cout将产生false,true,false,例如,当复

c++ - 编译器使用的 double 表示的显式规范

最近遇到visual-c++好像不是IEEE754的问题兼容,而是使用subnormalrepresentation.也就是说,其中的doublefloat没有通常表示的1个符号位、11个指数位和52个显式存储的有效小数位,见下文。由于gcc和clang是兼容的,因此非常需要一致的跨平台行为我想知道是否可以强制visual-c++使用正常表示。或者让gcc和clang使用次正规表示当然也可以解决问题。不同双重表示的问题可以在visual-c++中重现,gcc和clang使用以下代码:#include#includeintmain(){try{std::stod("8.097571188