G ++ 5.1的`-Wctor-dtor-privacy`警告被破坏了吗?

时间:2015-10-15 19:48:36

标签: gcc g++ clang++ gcc-warning g++5.1

ctor-dtor-privacy时会触发struct foo { public: static int test(void) { return 3; }; private: foo(void) {} }; 警告。

因此对于下面的课程,我希望警告触发:

clang++

但是clang 3.7.0 (trunk 238948)(版本-Wctor-dtor-privacy)和GCC 5.1.0在使用struct foo { private: static int test(void) { return 3; }; // private: // foo(void) {} }; 时都不会对此代码发出警告。这似乎是可疑的,但警告并不完美,所以我猜想会有一些假阴性。 (也许警告不会被触发,因为复制和移动构造函数仍然是隐式定义的,因此技术上并非所有构造函数都是私有的 - 即使仍然无法构造类。)

但是,此代码确实会收到警告:

test

这里,private被设为foo,并且删除了显式构造函数,以便隐式定义 warning: all member functions in class ‘foo’ are private [-Wctor-dtor-privacy] 的构造函数。 G ++给出了以下警告:

clang++

-Wctor-dtor-privacy没有任何警告。

此警告肯定似乎不正确,因为存在隐式公共构造函数。这里发生了什么?这是一个错误吗?

编辑:似乎Clang ++不会永远发出警告。即使是以下类也不会触发class ReallyTrulyPrivateOnly { private: ReallyTrulyPrivateOnly(void) =default; ReallyTrulyPrivateOnly(ReallyTrulyPrivateOnly&&) =default; ReallyTrulyPrivateOnly(const ReallyTrulyPrivateOnly&) =default; public: void foo(void) {} }; 的任何警告:

warning: ‘class ReallyTrulyPrivateOnly’ only defines private constructors and has no friends [-Wctor-dtor-privacy]

所以也许这个警告只是为G ++命令行兼容性提供的,但实际上什么也没做? (请注意,此类使用GCC生成一个非常明智的警告:View = Backbone.View.extend({ template: _.template($('#webphone-template').html()), events: { 'click #btn-webphone-answer': 'ring' }, initialize: function(opt) { // attach to the main body $(opt['main']).append(this.el) this.status = 'paused'; this.render(); }, ring: function() { $(this.el).find('#audio-ringtone')[0].play() }, render: function() { $(this.el).append(this.template({status: this.status})); return this; } }); new View({ main: $('body') });

编辑2:我认为此警告的行为未得到充分理解或记录,并且此问题已在all constructors and destructors are private中被注意到并报告。这在4.8版本中被标记为“已修复”,但由于我的行为似乎仍然令人怀疑,我已经添加了一条回复此问题的评论。

编辑3:以上编辑中的错误同一问题;我为此问题打开了bug 55813

0 个答案:

没有答案