On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 08.02.20 16:53. Заголовок: Баги компиляторов относительно спецификатора inline.


Компиляторы довольно вольно обращаются со спецификатором inline. Например, они не обязаны встраивать код функции в месте ее вызова несмотря на то, что вы объявили функцию со спецификатором inline. С другой стороны, компилятор сам без вашего ведома может встроить код функции в месте ее вызова, хотя вы не объявляли функцию со спецификатором inline.

Наверное, именно с этим связано наличие багов в известных компиляторах, имеющих отношение к спецификатору inline.

Например, согласно стандарту C++ 20 (9.1.6 The inline specifier [dcl.inline])



 цитата:
6. ... If a definition of a function or variable is reachable at the point of its first declaration as inline, the program is ill-formed.


Теперь рассмотрим следующую простую программу.
 
#include <iostream>

void f()
{
std::cout << "Hello inline specifier!\n";
}

inline void f();

int main()
{
f();

return 0;
}

Компиляторы gcc HEAD 10.0.1 20200 и Visual C++ 2019 успешно компилируют программу, и программа выводит на консоль сообщение
 
Hello inline specifier!


И лишь компилятор clang HEAD 11.0.0 выдает сообщение об ошибки во время компиляции
 
prog.cc:8:13: error: inline declaration of 'f' follows non-inline definition
inline void f();
^
prog.cc:3:6: note: previous definition is here
void f()
^
1 error generated.

Теперь обратимся к другому параграфу данной секции стандарта C++.

 цитата:
5. ... If the inline specifier is used in a friend function declaration, that declaration shall be a definition or the function shall have previously been declared inline.


Попробуем скомпилировать следующую программу перечисленными компиляторами.
 
#include <iostream>

void h();

class A
{
inline friend void h();
};

void h()
{
std::cout << "Hello inline specifier of ftiend!\n";
}

int main()
{

h();

return 0;
}


И ... программа успешно компилируется всеми тремя компиляторами! Вывод программы на консоль
 
Hello inline specifier of ftiend!


Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет