Почему возникает ошибка C2248, когда в приведенном ниже коде конструктор копирования является частным?

Этот код испускает error C2248: 'A::A' : cannot access private member declared in class 'A' в VS2010, хотя RVO не требует конструктора копирования. Чтобы доказать это, просто сделайте общедоступным объявление A(const A&); ниже, и код будет выполняться без проблем, даже без определения конструктора копирования.

class A
{
    int i;
    A(const A&);

    public:
    A() : i(1) {}

};

A f() { return A(); }

int main()
{
    A a;
    a = f();
}

person Belloc    schedule 12.04.2013    source источник


Ответы (1)


Тот факт, что ваша программа фактически не вызывает конструктор копирования, не означает, что его допустимо опускать. Объявление, но не определение, просто «обманывает» компилятор, делая функцию доступной во время компиляции, но не во время компоновки, поэтому, как только ее вызов оптимизирован, все «работает». Но RVO - это оптимизация производительности, и ваша программа должна быть написана так, чтобы она была правильной без наличия RVO.

person John Zwinck    schedule 12.04.2013
comment
Но RVO всегда применяется в компиляторах MS, даже в отладочных сборках. Итак, в этом случае компилятор знает, что конструктор копирования не нужен. - person Belloc; 12.04.2013
comment
Думаю, здесь была бы полезна цитата из The Standard. - person sharptooth; 12.04.2013
comment
@sharptooth: А тебе это действительно нужно? :) Из C ++ 03: 3.2p2 Конструктор копирования используется, даже если вызов фактически отменяется реализацией. 12.8p14 Программа неправильно сформирована, если конструктор копирования или Оператор присваивания копии для объекта используется неявно, а специальная функция-член недоступна (пункт 11). - person David Rodríguez - dribeas; 12.04.2013
comment
@ DavidRodríguez-dribeas: Да, я верю - часто проще обвинить во всем язык. - person sharptooth; 12.04.2013
comment
@sharptooth: Во всяком случае, у вас есть соответствующие цитаты. Вероятно, вы можете найти тот же текст в C ++ 11 где-нибудь в этих разделах. - person David Rodríguez - dribeas; 12.04.2013
comment
@ DavidRodríguez-dribeas: Большое спасибо. - person sharptooth; 12.04.2013
comment
@sharptooth Вы нашли текст в C ++ 11? - person Belloc; 12.04.2013
comment
@ user1042389: Нет, у меня нет доступа к тексту. - person sharptooth; 22.04.2013