gcc编译错误(关于复制c'tors)看起来很奇怪(至少对我而言)

时间:2012-02-03 12:58:26

标签: c++ gcc g++

所以,我有以下代码无法在OSX上的gcc 4.2.1上编译。我得到的错误是:

testref.cpp: In function ‘int main()’:
testref.cpp:10: error: ‘A::A(const A&)’ is private
testref.cpp:20: error: within this context

这是代码

#include <cstdio>

class A {
public:
    A() { i=0; printf("A ctor\n"); }
    ~A() { printf("A dtor\n"); }

private:
    A(const A& other) { i=other.i; printf("A COPY CTOR\n"); }
    A& operator=(const A& other) { i=other.i; printf("A COPY operator\n"); return *this; }
private:
    int i;
};

void f(const A &aref) {
    printf("dummy\n");
} 

int main() {
    f(A());
    return 0; 
}

在这种情况下不需要这个拷贝构造函数,因为f得到一个引用(我把它公开以查看它是否被调用而它没有)。 另外,我已经使f按值获取对象,并且仍然既没有复制构造函数也没有调用operator =。我怀疑这可能与优化有关。 有什么建议? 感谢。

1 个答案:

答案 0 :(得分:2)

你陷入了一个微妙的标准问题。 GCC是对的,但错误非常糟糕:使用clang进行编译会产生:

test.cpp:20:7: warning: C++98 requires an accessible copy constructor for class
              'A' when binding a reference to a temporary; was private

编辑:我没有附近的标准副本给你完整的推理。希望其他人(或谷歌)可以。