草庐IT

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

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

c++ - boost::any_cast - 仅在隐式转换不可用时抛出?

我要boost::any_cast仅在any类型时抛出异常没有隐式转换为T.如果any的类型,正常行为似乎是抛出异常。不是T,不考虑隐式转换。例子:boost::anya=1;boost::any_cast(a);//Thissucceeds,andrightfullysoboost::any_cast(a);//Idon'twantthistothrowboost::any_cast(a);//Iwantthistothrow谁能告诉我是否有一种简单的方法来获得我想要的功能,或者更好的是给我一个充分的理由来说明为什么现有的行为是这样的? 最佳答案

C++ 隐式转换和重载函数调用中的歧义

我面临以下问题:我有一个类V(比如一个vector),我可以从中生成两个类:CI和I(想想const_iterator和迭代器)。如果我有一个constV,那么我只能生成CI(再次想到iterator和const_iterator)。本质上,我想用(CIci)替换(constV&v),用(Ii)替换(V&v)。此外,我仍然希望能够将Vobj直接传递给需要I或CI的函数,从而实现从V和constV到CI和I的隐式转换。我面临的问题是,虽然重载函数可以区分(constV&v)和(V&v),但当我传递Vobj时,它们无法“区分”(CIci)和(Ii)。在代码中:structV{};struc

c++ - 未生成隐式移动函数

我有以下类(class):classBlub{public:Blub(intvalue);//Notacopyconstructor!Blub(Blub&&)=default;//ThislineisnecessarybecausemoveconstructorisnotaddedautomaticallyBlub&operator=(Blub&&)=default;//Doesnotwork!?//DisallowcopyBlub(Blubconst&)=delete;Blub&operator=(Blubconst&)=delete;};出于某些奇怪的原因,我不得不强制移动构造函数

c++ - 模板隐式实例化和内联成员

我想知道什么时候调用模板类的成员函数。在哪里生成定义?例如:templateclassA{public:A(){cout::A()"::f()"ob;//Timet1ob.f();//Timet2}所以我想知道模板类A是做什么的看起来像point1&point2案例1:时间t1:classA{public:A(){cout::A()"::fyetsothereisjustadeclaration};时间t1classA{public:A(){cout::A()"::f()"案例1:时间t1classA{public:A();voidf();};A::A(){cout::A()"时间t2

带有引用参数的 C++ 模板隐式实例化

在下面的简单示例中,我预计输出为“2222”。但是VC++11.0和g++4.6.1的实际输出都是“2122”。#includetemplatevoidfunc(Tx){x=2;std::cout(x);std::cout我反汇编后发现第一个func调用func((int&)x)使用func而不是func。为什么以及如何发生这种情况? 最佳答案 模板类型参数推导就是这样工作的。转换为int&无效,因为变量x已经是一个左值。当参数是左值且参数不是引用时,模板类型推导将推导出类型不是引用。

c++ - 如何将 Makefile 的隐式规则与 .cpp 文件一起使用?

在C++文件的Makefile中有一个隐式规则,它使用.C或.cc扩展名。但我通常使用C++源文件的.cpp文件扩展名。如何将Makefile的隐式规则用于.cpp文件? 最佳答案 参见CatalogueofImplicitRules:CompilingC++programsn.oismadeautomaticallyfromn.cc,n.cpp,orn.Cwitharecipeoftheform‘$(CXX)$(CPPFLAGS)$(CXXFLAGS)-c’.Weencourageyoutousethesuffix‘.cc’for

c++ - 为什么没有隐式类型转换的警告?

我终于在我的程序中找出了一个错误,它是由返回类型的隐式类型转换引起的。即使使用g++-Wall也不会对此发出警告。不知道有没有办法快速找出这种无脑错误?#include//returntypeshouldbeint,butIwroteboolbymistakeboolfoo(intx){returnx;}intmain(){for(inti=0;i 最佳答案 这是正确的代码。如果(i)i的类型int也是正确的。n33764.12/1Aprvalueofarithmetic,unscopedenumeration,pointer,or

C++ 隐式和显式继承构造函数调用

我有一个关于对基本构造函数的隐式和显式调用的问题。如果我们有这样的类层次结构:classPerson{protected:std::stringm_name;public:Person(std::string&_name):m_name(_name){std::cout根据我的讲义,主要是对'Baby'的调用,如下所示:std::stringbabyname="Robert";intnappies=5;Babybaby(babyname,nappies);导致以下情况发生:当在Baby的初始化列表中对Person进行显式调用时:Baby的初始化列表被调用,no_of_nappies被初

c++ - 在用它执行算术时隐式地将对象转换为浮点类型

假设我们有一个全局对象pi,我们想根据上下文将其隐式转换为float或double。以下不起作用:#includeclassPi{public:Pi(){}operatorfloat()const{returnstd::atan(1.0f)*4.0f;}operatordouble()const{returnstd::atan(1.0)*4.0;}};constPipi;#include#includeintmain(){std::cout它不起作用的原因是编译器不知道它是否应该将pi隐式转换为float或double.但是,假设我们总是希望它在二元算术运算符中转换为另一个操作数的类型