草庐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++ - 为什么在 OpenGL 中显式管理矩阵更好?

最近我一直在用OpenGL搞乱,我遇到了允许OpenGL管理View/模型/投影矩阵或自己管理它们之间的分歧,无论是使用您自己的矩阵实现还是诸如此类的库作为GLM。我已经看到很多大型项目都有自己的相机管理(即管理自己的平移、旋转等)。我明白为什么它有助于确保您完全控制系统,但除此之外,它似乎需要做很多工作才能获得边际yield。为什么自己管理比使用内置的OpenGL函数更好?显然这是在着色器管道的上下文中,而不是固定函数默认值。(这适用于任何3D库)。 最佳答案 (顺便说一句,OpenGLES2没有转换管理工具,因此在某些情况下您别

c++ - 不提供显式析构函数是不是不好的做法?

如果我没有为C++类提供显式析构函数,因为我确信编译器提供的默认析构函数是我的类所需的全部,这样可以吗?或者这被认为是不好的做法? 最佳答案 提供显式析构函数的主要优点是您可以轻松地将断点放入其中进行调试。有些人喜欢这样,因此更愿意为每个类提供一个显式析构函数。但是,如果类足够简单以至于默认构造函数显然就足够了,那么省略它是完全可以的。另请注意,添加析构函数确实有其缺点:除了代码中的额外噪音外,添加析构函数可能会阻止您的类成为POD。.因此,您仍应避免在整个代码中漫不经心地散布琐碎的析构函数。我认为省略一个空的非虚拟析构函数是有害的

c++ - 何时对多参数构造函数使用显式说明符?

我最近了解了explicit说明符。假设我们有:f(W,W,W);现在如果我们这样做f(42,3.14,"seven");编译器将尝试进行以下隐式转换:f(W(42),W(3.14),W("seven"));如果我们已经为W定义了匹配的构造函数,即:W(int);W(double);W(std::string);...它会成功。但是,如果我们明确第一个:explicitW(int);...这将禁用隐式转换。你现在必须写:f(W(42),3.14,"seven");即它迫使您明确说明转换现在开始问题:可以这样写:explicitW(int,int);//2arguments!编译成功!但

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操作