Является ли неопределенная переменная в аргументе по умолчанию плохой?

В С++ плохо ли иметь неопределенную переменную в качестве аргумента функции, которая имеет значение аргумента по умолчанию?

Я считаю, что это приведет к неопределенному поведению, но я видел это в каком-то ранее существовавшем коде, и я не вижу никаких выводимых предупреждений и хотел подтвердить поведение, которого я должен ожидать.

Заголовочный файл — header.h

#ifndef HEADER_H
#define HEADER_H

class aClass
{
    int someFunctionA(int aValue = 0);
    virtual int someFunctionB(int aValue = 0);
}

#endif

Файл CPP — body.cpp

int aClass::someFunctionA(int aValue)
{
    if (aValue == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

int aClass::someFunctionB(int aValue)
{
    if (aValue == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

int main(int argc, char **argv, char **envp)
{
    int uninitializedInt;
    int initializedInt = 1;

    aClass example = new aClass();

    aClass.someFunctionA(); // Expecting this to return 0
    aClass.someFunctionB(); // Expecting this to return 0

    aClass.someFunctionA(uninitializedInt); // Expecting this to be undefined behaviour
    aClass.someFunctionB(uninitializedInt); // Expecting this to be undefined behaviour

    aClass.someFunctionA(initializedInt); // Expecting this to return 1
    aClass.someFunctionB(initializedInt); // Expecting this to return 1
}

Верны ли мои ожидания в соответствии с моими комментариями к коду?


person Puddler    schedule 12.01.2016    source источник
comment
Are my expectations as per my code comments correct? Да (думаю?). Почему они должны ошибаться? ... Предупреждения могут не сработать, вот почему компьютеры не программируют.   -  person deviantfan    schedule 12.01.2016
comment
@deviantfan Я не получал никаких предупреждений и думал, что это может быть какое-то поведение, о котором я не знал. Например, если вы передадите неинициализированную переменную, она автоматически установит для нее значение по умолчанию.   -  person Puddler    schedule 12.01.2016
comment
Код вашего примера безнадежно сломан. Я ожидаю, что компилятор предупредит об использовании неинициализированной переменной, если вы установите достаточно высокие уровни предупреждений.   -  person Praetorian    schedule 12.01.2016
comment
@Praetorian: Тогда вам следует повысить уровень предупреждения компилятора. Как вы это сделаете, будет зависеть от компилятора.   -  person Martin York    schedule 12.01.2016
comment
Что касается дубликата, это действительно объясняет это здесь? До сих пор не мог найти ... ОП знает, что означает undefined в целом.   -  person deviantfan    schedule 12.01.2016
comment
@deviantfan Если бы я сформулировал вопрос немного лучше, я думаю, он был бы меньше похож на дубликат. Что-то вроде поведения функции undefined, если она имеет значение переменной по умолчанию, но вызывается с неопределенной переменной   -  person Puddler    schedule 12.01.2016
comment
Неинициализированные переменные будут иметь неопределенное значение, а использование неопределенного значения является неопределенным поведением, см. этот вопрос для получения последних сведений о C++   -  person Shafik Yaghmour    schedule 12.01.2016


Ответы (1)


Верны ли мои ожидания в соответствии с моими комментариями к коду?

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

person deviantfan    schedule 12.01.2016