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。