当我讨论我的另一个问题 (Member not zeroed, a clang++ bug?) 时,我实际上得到了这个问题的想法。这个问题是关于 C++11 值初始化的,但是当我看到有人在那里发布的 C++03 值初始化规则时,我感到很困惑。
C++03 的值初始化规则是:
To value-initialize an object of type T means:
- if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
- if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;
- if T is an array type, then each element is value-initialized;
- otherwise, the object is zero-initialized
请查看第二个项目符号,它为没有用户声明的构造函数的类型定义了值初始化过程。此规则未提及构造函数调用。从其他value-initialize情况的描述或者default-initialize的描述中可以看出,如果要调用constructor,标准的文中会明确提到。我知道有一些构造函数不会被调用的初始化形式(例如聚合体的{}初始化),但是对于没有用户声明的构造函数的非 union 类类型的值初始化应该是这样吗?这种类型的隐式声明的构造函数很容易是不平凡的。例如:
class A {
public:
virtual void f() {}
};
根据C++03的规则,如果在A对象的值初始化过程中没有调用隐式声明的非平凡构造函数,那么对象的 vptr 得到设置? (我知道与 vptr 相关的东西都是实现定义的,但这并没有改变我在这里要表达的主要观点。)
(有人会争辩说,在规则中没有提及构造函数调用并不意味着构造函数不会被调用。好的。假设构造函数将根据我可能忽略的其他规则被调用,但由于所有无论如何,成员都需要进行值初始化,这不会导致成员的构造函数被多次调用吗?)
当 C++03 到处都是 C++11 时,问一个关于 C++03 的问题似乎毫无值(value)。是的,这是一个有效的观点。但是,如果我最终弄清楚这一点(我是否错了以及为什么),我认为我或多或少可以学到一些东西。
编辑:也许我不应该使用 vptr 作为示例。我的观点是,跳过对非平凡构造函数的调用不会导致对象有效性出现一些潜在问题吗?毕竟,它被称为非平凡是有原因的。
最佳答案
就标准而言,构造函数不负责设置 vtable。没有人负责设置 vtable;就标准而言,虚表不存在。
相反,vtable 是编译器必须遵循的其他 规则的结果,与虚函数绑定(bind)等相关。因此,无论是否调用构造函数,vtable 都将在某处 设置,否则编译器将难以履行其其他职责。这并不与值初始化规则相矛盾;相反,它为实现规则的实用性增加了细微差别。
关于c++ - C++03 中某些值初始化的情况不调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21940769/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是