求问GNU C++如果实现一个NonCopyable
就一般情况下 如果想让一个成为不可拷贝的(Non-copyable) 只需要将其拷贝构造函数和赋值拷贝操作符声明为内部(private)的即可
但最近发现GNU编译器居然阻止我们这样做 很想了解下到底怎么回事
请看下面例子
class NonCopyable
{
public:
NonCopyable():Base(0){}
NonCopyable(int InBase):Base(InBase){}
private:
NonCopyable(const NonCopyable & In);
NonCopyable & operator =(const NonCopyable & In);
int Base;
};
int main()
{
NonCopyable nc = 1;
return 0;
}
上面这段代码在VC下可以成功编译 但GNU下面则出现编译错误
error: 'NonCopyable::NonCopyable(const NonCopyable&)' is private
研究下发现 原来上面这段代码在GNU下面的调用顺序和VC大不相同
GNU下面是先调用NonCopyable的构造函数构造一个临时对象 然后再将这个临时对象通过拷贝构造函数赋值给左边的值
于是本人通过修改代码 将
NonCopyable nc = 1;
改为
NonCopyable nc(1);
编译则通过了
PS: 我很清楚记得primer C++上明确说明 在创建变量的同时用赋值操作符初始化 实际上调用的是拷贝构造函数, 但实际上GNU却绕了一个弯
请问 如果是这种情况 要用什么办法来实现一个NonCopyable对象 求教!
[解决办法]
记错了吧?我记得C++ Primer上说的与GNU出现的情况一致!先创建临时变量,再使用赋值操作符。
[解决办法]
可以这样写,将复制构造函数声明为public但不定义。
就可以编译通过,但原因不明,求大神指点。
class NonCopyable {
NonCopyable &operator=(const NonCopyable &);
int base;
public:
NonCopyable(const NonCopyable &);
NonCopyable(int base0): base(base0) { }
};
int main()
{
NonCopyable nc = 1;
}
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 编译通过,其他编译器不知。
[解决办法]
我用VC和GCC测试了一下,处理NonCopyable=1时,都只是将1作为参数传递,调用 NonCopyable(int InBase):Base(InBase){},两者处理一样。
不过GCC下只有将拷贝构造函数声明公有,才能编译通过,什么原因不清楚。
[解决办法]
你误解了,和十楼意思差不多,我说的是处理NonCopyable=1时,使用赋值操作符初始化对象,VC和GCC都是直接构造的对象,将1作为参数,都仅仅调用了NonCopyable(int InBase):Base(InBase){};
虽然函数调用与拷贝构造无关,不过GCC下不能将拷贝构造声明为私有,原因不明。
[解决办法]
我觉得应该于内核无关,纯粹是编译器的关系。
g++ --version 可查看g++版本号。