Поведение члена указателя bool отличается при назначении true и false - PullRequest
3 голосов
/ 16 февраля 2011

Я использую простой член класса указатель bool. Назначение ложных респ. true ведет себя по-разному - см. комментарии в коде. Я рекомендую один, чтобы проверить другой ниже.

Я использую вызов компилятора g++ -o basic basic.cpp

class Test
{
public:
    int a;
    bool* abool;
};


int main() {
    Test t;

    //t.abool = false;              // WORKS
    //t.abool = true;               // ERROR: cannot convert 'bool' to 'bool*' in assignment - expected IMO; 

    // this should work for both values IMO
    //*(t.abool) = true;            // Segmentation fault
    //*(t.abool) = false;           // Segmentation fault



    cout << t.abool << endl;

    return 0;
}

Ответы [ 4 ]

10 голосов
/ 16 февраля 2011

Это потому, что существует преобразование из false в 0. Таким образом, он становится t.abool = 0;, который инициализирует abool с NULL. Однако true преобразуется в 1 и, поскольку вы не можете инициализировать указатель с абсолютным целым числом, вы получаете ошибку компилятора. Во втором случае (с комментарием это должно работать IMO) вы получите ошибку сегмента, поскольку вы пытаетесь разыменовать унифицированный указатель, который вызывает неопределенное поведение.

6 голосов
/ 16 февраля 2011

Вы bool* не были инициализированы, чтобы указывать на что-либо.

Вы можете присвоить ему нулевое значение указателя (в которое false преобразуется) или действительный указатель на bool объект:

bool test;

t.abool = 0; // or NULL
t.abool = &test;

Как только он указывает на фактический bool объект, вы можете присвоить этому объекту значение bool через указатель:

*t.abool = true;
*t.abool = false;
1 голос
/ 16 февраля 2011

Любой литерал числового типа и нулевого значения может быть неявно преобразован в нулевой указатель.bool является числовым типом, а false имеет значение ноль.Ненулевые значения (такие как true) не могут быть неявно преобразованы в указатель.

1 голос
/ 16 февраля 2011

false работает, потому что false, вероятно, воспринимается g ++

как 0
...