草庐IT

c++ - 从类类型到类类型的隐式转换

我正在研究C++中的转换构造函数和转换运算符。到目前为止我学到的是,任何只接受一个参数(和任意数量的可选默认参数)的非显式构造函数都表示到该类类型的隐式类类型转换,例如,如果一个类定义了一个具有一个int类型的参数我可以在任何需要该类类型的对象的地方使用int:(假设class_type有一个重载的+=运算符)class_typea;a+=5;在这种情况下,5被隐式转换(通过转换构造函数)为class_type并调用重载运算符。现在,(至少对我而言)棘手的部分:我知道我可以将转换运算符定义为成员函数:operatorint(){....};将class_type的对象转换为原始int类

c++ - 如何防止从 char 数组到 bool 的隐式转换

structFoo{voidsetBar(boolbar_){bar=bar_;}boolbar;};intmain(){Foof;f.setBar("true");}由于类型转换,上述代码编译成功,即使在需要bool的地方传递了一个char数组。是否有可能导致这段代码编译失败?(首选C++03解决方案,因为我工作场所的编译器很古老。)我查看了StackOverflow上的以下相关问题,但它们并没有完全解决这个问题。PreventingimplicitconversioninC++,Whydoesthecompilerchoosebooloverstringforimplicittyp

C++ 隐式转换为 bool

为了使我的枚举更加类型安全,我一直在使用宏生成的重载运算符来禁止将枚举与除相同类型的枚举之外的任何东西进行比较:#include#defineMAKE_ENUM_OPERATOR_TYPESAFE(enumtype,op)\template\inlinebooloperatorop(enumtypelhs,Trhs)\{\BOOST_STATIC_ASSERT(sizeof(T)==0);\returnfalse;\}\\template\inlinebooloperatorop(enumtypelhs,enumtyperhs)\{\returnstatic_cast(lhs)opst

C++ 函数到指针的隐式转换 : which compiler is right? Clang 和 GCC 不同意

templatestructA{};voidfunc();Aa;//sameresultwithAa;此代码使用Clang(包括最新的8.0.0)编译,但不能使用GCC(包括最新的9.1)编译。GCC说:错误:'void()'不是模板非类型参数的有效类型哪个编译器是正确的,为什么?更新我猜GCC是错误的,因为以下代码在Clang和GCC上都可以编译:templatestructA{};voidfunc();Aa;//sameresultwithAa;因此与GCC在第一个示例中的报告相反,void()似乎是“模板非类型参数的有效类型” 最佳答案

C++ 隐式转换运算符优先级

编辑:根据MikeSeymour的评论,我将operatorstd::string()const;替换为operatorchar*()const;并相应地更改了实现。这允许隐式转换,但是,出于某种原因,unsignedlongint运算符优先于char*运算符,这感觉不对......另外,我不想在类,当我有std::string时。我有一种预感,我的CustomizedInt类需要继承一些东西才能支持我想要的功能。有人可以详细说明Mike关于std::basic_string的评论吗?我不确定我是否理解正确。我有这段代码:#include#include#includeclassCus

c++ - 隐式虚 constexpr 函数

虚函数不能是constexpr但是,当一个函数通过继承隐式虚函数时,我试过的编译器不会提示它。这是一个示例代码:classA{virtualvoiddoSomething(){}};classB:publicA{constexprvoiddoSomething()override{}//implicitlyvirtualconstexpr//butnocompilationerror};classC:publicA{virtualconstexprvoiddoSomething()override{}//explicitlyvirtualconstexpr//compilationer

c++ - 隐式生成的赋值运算符应该是 & ref 限定的吗?

以下代码在gcc4.8.1上编译没有问题:#includestructfoo{};intmain(){foobar;foo()=bar;foo()=std::move(bar);}似乎为foo隐式生成的赋值运算符不是&引用限定的,因此可以在右值上调用。根据标准,这是正确的吗?如果是这样,有什么理由不要求隐式生成的赋值运算符是&ref-qualified?为什么标准不要求生成以下内容?structfoo{foo&operator=(fooconst&)&;foo&operator=(foo&&)&;}; 最佳答案 好吧,有一些合法的用

c++ - 是否有一种规范的方法允许将非 const 模板参数类型隐式转换为 const 类型?

我有一个接受特定模板类型参数的函数;简化版本可能如下所示:#includetemplatestructfoo{//defaultconstructorfoo(){}//simplecopyconstructorthatcanconstructafoofromafoo//orfoofoo(constfoo::type>&){}};功能上,foo行为类似于shared_ptr,以及与此问题无关的其他一些插件功能。该函数的语义决定它更喜欢接受foo。.foo可以从foo隐式构造,所以我希望能够执行以下操作:templatevoidbar(foof){}intmain(){bar(foo())

c++ - 如何使用隐式模板类型推导

我正在尝试编写一个模板来在编译期间计算一个数的幂(我不是模板元编程专家,因此欢迎任何评论)。下面是代码:templatestructPow{staticconstexprTresult=X*Pow::result;};templatestructPow{staticconstexprTresult=1;};templatestructPow{staticconstexprTresult=X;};我需要这样调用:Pow::result问题:有没有什么方法可以编写帮助程序模板以便调用跳过decltype?例如:Pow::result我已阅读以下内容,但到目前为止我还没有看到答案(似乎恰恰相

c++ - 为什么我的 fstream 被隐式删除了?

我正在使用一些HID设备,所有这些设备都有派生自以下基类的类(在main.h中):classHIDDevice{public:hid_device*device;virtualvoidread(std::fstream)=0;virtualvoidwrite(std::fstream)=0;};这是派生自它的设备类之一(device.h):classMyDevice:publicHIDDevice{public:voidread(std::fstream);voidwrite(std::fstream);};...和实现示例:voidMyDevice::read(std::fstrea