草庐IT

c++ - 默认构造函数和析构函数的 "=default"与 "{}"有何不同?

coder 2023-04-24 原文

我最初将这个问题发布为仅关于析构函数的问题,但现在我添加了对默认构造函数的考虑。这是原始问题:

If I want to give my class a destructor that is virtual, but is otherwise the same as what the compiler would generate, I can use =default:

class Widget {
public:
   virtual ~Widget() = default;
};

But it seems that I can get the same effect with less typing using an empty definition:

class Widget {
public:
   virtual ~Widget() {}
};

Is there any way in which these two definitions behave differently?

根据针对此问题发布的回复,默认构造函数的情况似乎相似。鉴于析构函数的“=default”和“{}”之间的含义几乎没有区别,那么默认构造函数的这些选项之间的含义同样几乎没有区别?也就是说,假设我想创建一个类型,该类型的对象将被创建和销毁,我为什么要说

Widget() = default;

而不是

Widget() {}

?

如果在原始发布后扩展此问题违反了某些 SO 规则,我深表歉意。为默认构造函数发布一个几乎相同的问题让我觉得不太理想。

最佳答案

当询问构造函数而不是析构函数时,这是一个完全不同的问题。

如果你的析构函数是virtual,那么差别可以忽略不计,as Howard pointed out .但是,如果您的析构函数是非虚拟的,那就完全不同了。构造函数也是如此。

对特殊成员函数(默认构造函数、复制/移动构造函数/赋值、析构函数等)使用 = default 语法与简单地执行 {} 有很大不同。使用后者,该功能变为“用户提供”。这改变了一切。

这是 C++11 定义的一个微不足道的类:

struct Trivial
{
  int foo;
};

如果您尝试使用默认构造函数一,编译器将自动生成默认构造函数。复制/移动和破坏也是如此。因为用户没有提供任何这些成员函数,所以 C++11 规范认为这是一个“微不足道的”类。因此,这样做是合法的,比如 memcpy 它们的内容以初始化它们等等。

这个:

struct NotTrivial
{
  int foo;

  NotTrivial() {}
};

顾名思义,这不再是微不足道的。它有一个用户提供的默认构造函数。是否为空也没关系;就 C++11 的规则而言,这不可能是一个平凡的类型。

这个:

struct Trivial2
{
  int foo;

  Trivial2() = default;
};

顾名思义,这是一种微不足道的类型。为什么?因为您告诉编译器自动生成默认构造函数。因此构造函数不是“用户提供的”。因此,类型算得上是微不足道的,因为它没有用户提供的默认构造函数。

= default 语法主要用于执行复制构造函数/赋值之类的操作,当您添加阻止创建此类函数的成员函数时。但它也会触发编译器的特殊行为,因此它在默认构造函数/析构函数中也很有用。

关于c++ - 默认构造函数和析构函数的 "=default"与 "{}"有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576055/

有关c++ - 默认构造函数和析构函数的 "=default"与 "{}"有何不同?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  7. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  8. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  9. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  10. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

随机推荐