读书人

求问GNU C++如若实现一个NonCopyable

发布时间: 2013-01-11 11:57:35 作者: rapoo

求问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下只有将拷贝构造函数声明公有,才能编译通过,什么原因不清楚。
[解决办法]
引用:
我在原文提到过这个问题 因为在GCC下面

如果使用复制拷贝操作……


你误解了,和十楼意思差不多,我说的是处理NonCopyable=1时,使用赋值操作符初始化对象,VC和GCC都是直接构造的对象,将1作为参数,都仅仅调用了NonCopyable(int InBase):Base(InBase){};
虽然函数调用与拷贝构造无关,不过GCC下不能将拷贝构造声明为私有,原因不明。





[解决办法]
引用:
引用:可以这样写,将复制构造函数声明为public但不定义。
就可以编译通过,但原因不明,求大神指点。
C/C++ code?123456789101112class NonCopyable { NonCopyable &operator=(const NonCopyable &); ……

我觉得应该于内核无关,纯粹是编译器的关系。
g++ --version 可查看g++版本号。

读书人网 >C++

热点推荐