编辑:请参阅GWW的答案,问题是简单地使用C :: Instance()进行非法复制。而我错了,错误不取决于可变。具有可变成员的单身人士对象
静态方法是否与可变方法不兼容?下面是我的代码的简化版本:
c.h:
class C
{
public:
static C& Instance();
private:
C();
mutable QMutex _mutex;
};
c.cpp:
C& C::Instance()
{
static C instance;
return instance;
}
C c = C::Instance();
然后我得到的错误(GCC 4.2)是
error: 'QMutex::QMutex(const QMutex&)' is private within this context
synthesized method 'C::C(const C&)' first required here //at C::Instance()
如果我删除了“可变”关键字这个错误消失,但随后的当然,我不能使锁定/解锁_mutex const的方法。写我自己的副本ctor不会改变任何东西。任何人都知道如何解决此问题?注意,这看起来与this post类似,但这是Objective-C,那里的代码太多,似乎与该问题没有关系。
编辑:刚刚意识到这个问题,很明显,是QMutex的拷贝构造函数是私有的。但我不明白为什么'可变'应该在这里有所作为,也就是为什么它会产生副本。
'C c = C :: Instance();'会复制实例吗?你确定这就是你想要做的? – GWW
@GWW哦,大声笑你说得对! * blush * –
所以问题归结为:mutable是如何影响编译器生成的拷贝构造函数的公有/私有性质的? –