g++3.4.6中C++构造函数/复制构造函数问题
以下是一段代码片段:g++3.4.6中C++构造函数/复制构造函数问题,c++,g++,C++,G++,以下是一段代码片段: class test { public: test(){ cout<<"I am in default constructor "; } static void func(const test &obj){ cout<<"I am i
class test {
public:
test(){
cout<<"I am in default constructor ";
}
static void func(const test &obj){
cout<<"I am in function ";
}
protected:
test( const test &o){
cout<<"I am in copy constructor ";
}
};
int main()
{
test::func(test());
}
上面的代码给出了编译时Red Hat Linux上g++3.4.6的以下错误:
在函数“int main”中:
错误:`test::testconst test&`受保护
错误:在此上下文中
但是,如果在Red Hat Linux上使用g++3.3.2或g++4.4.3或任何其他g++版本进行编译,它将成功编译并提供以下输出:
我在默认构造函数中,我在函数中
在上面的代码中,我通过引用将默认构造函数创建的临时对象传递给函数func。那么为什么编译器3.4.6调用复制构造函数?最有可能是因为旧的G+版本,我认为它代表其他编译器不是完全符合C++的,而且有更多的bug,然后是当前版本。正如您所说,这在更高版本上有效,因此它很可能是固定的 编辑
顺便问一下,您是否尝试过更改编译器设置?不同的优化级别可能有不同的bug。
最有可能是因为旧的G+版本,我认为它代表其他编译器,并不是完全符合C++的,并且有更多的bug,然后是当前版本。正如您所说,这在更高版本上有效,因此它很可能是固定的
编辑顺便问一下,您是否尝试过更改编译器设置?不同的优化级别可能有不同的错误。重复的重复-这不是错误。它是合规的。这种行为在GCC中被改变了,因为它有点愚蠢,而语言本身在C++0x中修复了它。@Tomalak感谢您的参考。这种行为确实很愚蠢,我不知道5.2.3——它不是一个bug。它是合规的。这种行为在GCC中被改变了,因为它有点愚蠢,而语言本身在C++0x中修复了它。@Tomalak感谢您的参考。这种行为确实很愚蠢,我不知道5.2.3