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