Почему компилятор не выдает ошибку из-за того, что не возвращает этот указатель для функции, тип возврата которой — classname & amp;

Почему компилятор не выдает ошибку из-за того, что не возвращает этот указатель для функции, тип возвращаемой которой — имя класса&

Пример: в функциях readonly, readwrite и т. Д., Даже если мы комментируем return * this и ничего не возвращаем, похоже, это работает нормально, а механизм сцепления отлично работает в основной функции.

Будут ли эти функции возвращать * это автоматически?

class OpenFile {
public:
OpenFile(const std::string& filename);

OpenFile& readonly();  // changes readonly_ to true
OpenFile& readwrite(); // changes readonly_ to false
OpenFile& createIfNotExist();
OpenFile& blockSize(unsigned nbytes);

private:
friend class File;
std::string filename_;
bool readonly_;          // defaults to false [for example]
bool createIfNotExist_;  // defaults to false [for example]

unsigned blockSize_;     // defaults to 4096 [for example]

};
inline OpenFile::OpenFile(const std::string& filename)
: filename_         (filename)
, readonly_         (false)
, createIfNotExist_ (false)
, blockSize_        (4096u)
{ }
inline OpenFile& OpenFile::readonly()
{ readonly_ = true; return *this; }
inline OpenFile& OpenFile::readwrite()
{ readonly_ = false; return *this; }
inline OpenFile& OpenFile::createIfNotExist()
{ createIfNotExist_ = true; return *this; }
inline OpenFile& OpenFile::blockSize(unsigned nbytes)
{ blockSize_ = nbytes; return *this; }

main()
{
//OpenFile *obj = new OpenFile();
OpenFile f = OpenFile("foo.txt")
.readonly()
.createIfNotExist()
.blockSize(1024);
}

Удаление оператора return вообще не повлияет на код, как-то так

inline OpenFile& OpenFile::readonly()
{ readonly_ = true;  }
inline OpenFile& OpenFile::readwrite()
{ readonly_ = false;  }
inline OpenFile& OpenFile::createIfNotExist()
{ createIfNotExist_ = true; }
inline OpenFile& OpenFile::blockSize(unsigned nbytes)
{ blockSize_ = nbytes;  }

Как компилятор обрабатывает эти функции или он автоматически * возвращает это, взглянув на тип возвращаемого значения?

0

Решение

Как компилятор обрабатывает эти функции

неопределенным образом

или это автоматически возвращает * это, посмотрев на тип возвращаемого значения?

нет. поведение программы не предсказуемо и, конечно, не будет правильным.

но похоже на работу

в неоптимизированной сборке, очень вероятно. Регистр, содержащий this указатель, вероятно, не изменяется.

Подождите, пока оптимизатор не начнет вставлять ваш код в вашу сборку релиза. Наслаждайтесь фейерверком.

Почему компилятор не жалуется?

Если вы включите предупреждения, это будет. Вы должны всегда включать все предупреждения. Они помогают вам избежать неправильного кода:

/tmp/gcc-explorer-compiler116311-75-17mquww/example.cpp: In member function 'OpenFile& OpenFile::readonly()':
28 : warning: no return statement in function returning non-void [-Wreturn-type]
{ readonly_ = true; }
^
Compiled ok

Из §6.6.3 (2):

Выпуск из конца функции эквивалентен возврату без значения; это приводит к
неопределенное поведение в функции, возвращающей значение.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]