草庐IT

c++ - 隐式使用析构函数

我有一个带有已删除析构函数的类(实际上,它需要外部帮助才能被销毁):structindestructible{indestructible(indestructible&&);~indestructible()=delete;};当我尝试使用它的移动构造函数时,编译器会报错:structuser{indestructibleind;user(indestructible&&ind):ind(std::move(ind)){}};indestructible.cc:11:3:error:attempttouseadeletedfunctionuser(indestructible&&in

c++ - 为什么定义析构函数会删除隐式定义的移动赋值运算符?

C++标准委员会选择在定义自定义析构函数时删除隐式定义的移动赋值运算符背后的基本原理是什么? 最佳答案 来自ScottMeyer的EffectiveModernC++Item17(假设您了解RuleofThree):AconsequenceoftheRuleofThreeisthatthepresenceofauser-declareddestructorindicatesthatsimplememberwisecopyisunlikelytobeappropriateforthecopyingoperationsintheclas

c++ - 防止隐式模板实例化

在这样的方法重载情况下:structA{voidfoo(inti){/*...*/}templatevoidfoo(Tt){/*...*/}}除非明确命令,否则如何防止模板实例化?:Aa;a.foo(1);//oka.foo(1.0);//oka.foo(1);//callsnon-templatedmethoda.foo(1.0);//error谢谢! 最佳答案 你可以介绍一个depedent_type阻止templateargumentdeduction的结构.templatestructdependent_type{using

c++ - 使用 `extern template` 防止模板类的隐式实例化

考虑以下代码片段:templatestructX{};externtemplatestructX;intmain(){X{};}它编译并链接:liveexampleongodbolt.org.由于externtemplate声明,我希望它不会链接。我的理解是externtemplate的意思是:“请不要在这个TU中实例化这个特定的模板特化,它将由其他一些TU提供,你可以链接到它”.示例/描述。我在isocpp上看到过,cppreference似乎验证了我的心智模型。例如Fromhttps://en.cppreference.com/w/cpp/language/class_templa

C++ 隐式转换运算符

我正试图在C++中找到一个很好的继承解决方案。我有一个Rectangle类和一个Square类。Square类不能公开继承自Rectangle,因为它不能完全满足矩形的要求。例如,一个矩形可以分别设置其宽度和高度,而这对于方形当然是不可能的。所以,我的困境。Square显然会与Rectangle共享很多代码;它们非常相似。例如,如果我有这样的函数:boolIsPointInRectangle(constRectangle&rect);它也应该适用于正方形。事实上,我有很多这样的功能。所以在制作我的Square类时,我想我会使用私有(private)继承和一个可公开访问的Rectangl

c++ - 带有返回 const 引用的隐式转换运算符的类的 static_cast<> 行为

我有以下类(class)(精简后只包含相关部分):#includeclassText{private:std::string_text;public:Text(std::string&&text):_text(std::move(text)){}operatorconststd::string&()const{return_text;}};我的问题是:如果我想获得一个conststd::string&,我可以这样做而不会受到任何惩罚吗:Texttext("fred");auto&s=static_cast(text);或者这会构造一个我最终得到引用的中间std::string吗?这种情

c++ - 数据类型之间的隐式转换

例如,为什么unsignedshort和int之间的运算结果总是产生int?unsignedshorts=65535;inti=65535表达式typeid(s*i*i).name(),给出了一个超出int范围的值,但隐式转换仍然返回一个int,为什么? 最佳答案 有一组转换称为usualarithmeticconversions在大多数算术运算符的评估之前使用。基本上,您可以认为有一些整数运算规则:首先,从不使用“小于”int的操作数执行整数运算,因此在short*signedchar的情况下,short和signedchar操作

c++ - 在 C++ 中防止从 float 到 double 的隐式转换

基本上,如果我想要这样的东西,doubleb=sin(2.2);但是不小心写了这样的东西,doubleb=sin(2.2f);没有错误甚至警告消息,即使这显然会导致不同的、不准确的、因此不正确的结果。可以通过强制编译器不对float进行任何隐式转换来防止这种类型的错误。有什么方法可以实现这一点,无论是通过编译开关(最好在VisualStudio中)、一些智能宏,还是一个行为类似于float/double变量并声明其自己的运算符的类?编辑:我也对使用运算符(例如doubleb=2.2f*2.2f)或赋值(doubleb=2.2f)解决类似问题感兴趣。 最佳答案

c++ - constexpr 函数是隐式静态的吗?

如果我在我的program.cpp中定义一个函数:constexprboolisThree(constintnumber){returnnumber==3;}这与声明它为静态有什么不同吗?staticconstexprboolisThree(constintnumber){returnnumber==3;}看起来这些应该是等价的,因为constexpr意味着函数是内联的,因此不在编译单元之间共享。constexpr全局函数是隐式静态的吗? 最佳答案 constexpr函数是隐式内联。inline是一种链接功能。在不同编译单元中定义的

c++ - 解决 C、C++ 中隐式包含的想法

我刚刚想出了一个解决问题的想法并想分享它。对不起,如果太平庸。因此,我正在审查的一个大型C++项目包含许多依赖于其他包含的符号但不包含所需包含的包含。构建过程中的任何细微变化都会导致“缺少符号”失败。因此,为了立即检查所有包含的自包含,我搜索所有*.h,即时创建一个cpp文件,其中仅包含带有此.h文件的#include-statement并尝试编译它.最后,我获得了“好”和“坏”包含文件的列表。很酷是不是:-)或者有更简单的解决方案吗? 最佳答案 如果每个.cpp文件首先包含它自己的头文件,然后是其他头文件,您将在不使用外部工具的情