Замена стека вместо статической переменной экземпляром структуры, содержащей константный член - PullRequest
4 голосов
/ 14 ноября 2011

Использование gcc версии 4.4.3 следующим образом:

gcc -g -x c++ -lstdc++ -std=c++98 -o ./main ./main.cpp

этот код в main.cpp компилируется нормально:

#include <iostream>

struct A
{
    A()
    : m_flag(false)
    {
    }

    const bool m_flag;
};

static A aa = A();

int main(int argc, char* argv[])
{
    A a;

    // Not static = copy OK
    A b( a );
    A c = b;
    A d = A();

    // Static = copy not OK
    // aa = A();
}

Но если я раскомментирую aa = A();, я получу:

./main.cpp: In member function 'A& A::operator=(const A&)':
./main.cpp:4: error: non-static const member 'const bool A::m_flag', can't use default assignment operator
./main.cpp: In function 'int main(int, char**)':
./main.cpp:24: note: synthesized method 'A& A::operator=(const A&)' first required here 

Почему конструкция копирования по умолчанию и назначение копирования работают для копий в стеке, но не при замене неконстантного static на копию?

1 Ответ

4 голосов
/ 14 ноября 2011

Проблема в этой строке:

 const bool m_flag;
 ...
 aa = A();  // invokes 'A::operator =(const A&)`

, которая вызывает значение по умолчанию operator =.Изменение члена const является тривиальной ошибкой.

A b( a );   // all invoke `A::A(const A&)`
A c = b;  
A d = A(); 

вызывает конструктор копирования по умолчанию (не operator =, как вы предполагаете), где m_flag назначается новое значение при самой инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...