Почему компилятор не выдает ошибку из-за того, что не возвращает этот указатель для функции, тип возвращаемой которой — имя класса&
Пример: в функциях 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; }
Как компилятор обрабатывает эти функции или он автоматически * возвращает это, взглянув на тип возвращаемого значения?
Как компилятор обрабатывает эти функции
неопределенным образом
или это автоматически возвращает * это, посмотрев на тип возвращаемого значения?
нет. поведение программы не предсказуемо и, конечно, не будет правильным.
но похоже на работу
в неоптимизированной сборке, очень вероятно. Регистр, содержащий 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):
Выпуск из конца функции эквивалентен возврату без значения; это приводит к
неопределенное поведение в функции, возвращающей значение.
Других решений пока нет …