Ошибка компиляции gcc (относительно копий c'tors), которая кажется странной (по крайней мере, мне) - PullRequest
4 голосов
/ 03 февраля 2012

Итак, у меня есть следующий код, который не скомпилируется на gcc 4.2.1 на OSX.Я получаю ошибку:

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 получить объект по значению, и до сих пор не вызывается ни конструктор копирования, ни оператор =.Я подозреваю, что это может быть связано с оптимизацией.Какие-либо предложения?Спасибо.

1 Ответ

2 голосов
/ 03 февраля 2012

Вы попали в тонкую проблему стандартов. 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

Изменить: У меня нет моей копии стандартов поблизости, чтобы дать вам полное обоснование. Надеюсь, кто-то другой (или Google) может.

...