Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/55: Рейтинг темы: голосов - 55, средняя оценка - 4.73
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602

Virtual и noreturn

23.02.2015, 19:57. Показов 10582. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли подружить virtual и noreturn? Пишу:
C++
1
2
3
4
5
struct test
{
    int func(){error();}
    [[noreturn]]virtual void error(){throw 0;}
};
Компилятор ругается что мол warning: no return statement in function returning non-void. То есть, атрибут noreturn он молча проигнорировал.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2015, 19:57
Ответы с готовыми решениями:

Атрибут [[noreturn]]
Атрибут ] у функций насколько я понимаю говорит компилятору что данная функция не должна возвращать управление (например, представим...

Protected abstract virtual base pure virtual private destructor
Хай, all) Вопрос не для начинающих и дурацкий) В разделе для экспертов публиковать не стал, чтобы не засорять его) Наткнулся тут на...

Какая разница между "void virtual" и "virtual void"?
какая разница между этими двумя записями viod virtual xexe() =0; и virtual void xexe()=0; Возможно это "нубо" вопрос но ...

55
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
23.02.2015, 20:11
Цитата Сообщение от Renji Посмотреть сообщение
no return statement in function returning non-void.
C++
1
int func(){error();}
где return?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 20:21  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
где return?
Нигде и никогда. Произошел вызов noreturn метода, а значит весь последующий код, включая гипотетический return, не будет выполнен никогда. Если объявить noreturn метод обычным, компилятор это понимает. А вот с виртуальным чего-то не дружит.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
23.02.2015, 20:29
Цитата Сообщение от Renji Посмотреть сообщение
Нигде и никогда. Произошел вызов noreturn метода, а значит весь последующий код, включая гипотетический return, не будет выполнен никогда.
да плевать компилятор хотел на error и всё остальное. Ему важно, что в func, которая возвращает int, нет return-statement, а значит надо об этом орать на всех углах.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 20:35  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
да плевать компилятор хотел на error и всё остальное. Ему важно, что в func, которая возвращает int, нет return-statement, а значит надо об этом орать на всех углах.
[[noreturn]] атрибут введен именно для того чтобы компилятору было НЕ плевать. Напишите вот так и он заткнется:
C++
1
2
3
4
5
struct test
{
    int func(){error();}
    [[noreturn]]void error(){throw 0;}
};
Но это будет без виртуального метода, а мне надо с виртуальным.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.02.2015, 20:37
Renji, а __declspec(noreturn) не подойдет здесь ?
(скромно предполагая, что речь о Visual C++...)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 20:44  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Renji, а __declspec(noreturn) не подойдет здесь ?
(скромно предполагая, что речь о Visual C++...)
Во-первых, речь идет о C++11. Во-вторых, у меня g++ 4.9.1 и он понимать __declspec(noreturn) не захотел.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 20:49
Цитата Сообщение от Renji Посмотреть сообщение
у меня g++ 4.9.1
[[noreturn]] ставиться возле функции, которая никогда не вернет значение.


http://rextester.com/MJNV18278

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Title of this code
//g++  4.8.2
 
#include <iostream>
 
 
struct test
{
    [[noreturn]]int func(){error();}
    virtual void error(){throw 0;}
};
 
int main()
{
    std::cout << "Hello, world!\n";
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 21:13  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
[[noreturn]] ставиться возле функции, которая никогда не вернет значение.
Не совсем то. Мне нужно чтобы методы test или возвращали корректное значение, или аварийно завершались вызовом error. А вот error как раз и должен всегда кидать исключение зависящее от ошибки. Если быть точным, он должен запихать определенную строчку в std::runtime_error и кинуть результат. Но в тестовом примере хватит и throw 0.
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct test
{
    int func()
    {
        if(value<100)
            return value;//функция может вернуть значение
        else
            error();//а может упасть с ошибкой
    }
    [[noreturn]]void error(){throw 0;}
    int value;
};
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 21:25
Цитата Сообщение от Renji Посмотреть сообщение
struct test
{
* * int func()
* * {
* * * * if(value<100)
* * * * * * return value;//функция может вернуть значение
* * * * else
* * * * * * error();//а может упасть с ошибкой
* * }
* * [[noreturn]]void error(){throw 0;}
* * int value;
};
Ну и в чем проблема? Этот код прекрасно компилируется.
Только атрибут там лишний: поскольку error у вас итак ничего не возвращает.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 21:36  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
Ну и в чем проблема? Этот код прекрасно компилируется.
Проблема в том, что если я делаю error виртуальным, то получаю "warning: control reaches end of non-void function". А [[noreturn]] синтаксис я использовал именно чтоб от этого надоедливого варнига избавиться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct test
{
    int func(){
        if(value<100)
            return value;
        else
            error();
    }
    [[noreturn]]virtual void error(){throw 0;}
    int value;
};
 
int main()
{
    test t;
    t.func();
    return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
Только атрибут там лишний: поскольку error у вас итак ничего не возвращает.
По умолчанию он возвращает как минимум управление. Я же пытаюсь втолковать компилятору что функция выкинет исключение, а потому управление вызвавшему ее методу не вернет никогда.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 21:51
Цитата Сообщение от Renji Посмотреть сообщение
от этого надоедливого варнига избавиться.
приведите полный текст предупреждения.

(с какими ключиками собираете проект? не получается воспроизвести ворнинг)


ваш код у меня дал только один ворнинг:
'struct test' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]

Лично я подавляю предупреждения вот таким способом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
 
 //'struct test' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
    #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif
 
 
struct test
{
    int func()
    {
        if(value<100)
            return value;//функция может вернуть значение
        else
            error();//а может упасть с ошибкой
    }
    virtual void error(){throw 0;}
    int value;
};
 
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic pop
#endif
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 22:14  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
приведите полный текст предупреждения.
/home/zero/test/main.cpp:8: warning: control reaches end of non-void function [-Wreturn-type]
Цитата Сообщение от hoggy Посмотреть сообщение
(с какими ключиками собираете проект? не получается воспроизвести ворнинг)
Какие Qt поставил плюс -std=c++11. Конкретно g++ по логам вызывается как:
g++ -c -pipe -std=c++11 -O2 -Wall -W -DQT_WEBKIT -I/usr/share/qt4/mkspecs/linux-g++ -I../test -I../test -I. -o main.o ../test/main.cpp
Цитата Сообщение от hoggy Посмотреть сообщение
Лично я подавляю предупреждения вот таким способом:
Ну это понятно что можно найти ключик компилятора отключающий диагностические сообщения. Но я предпочитаю чтоб они были. Только по делу, а не по отсутствию return после кидающей исключение функции.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 22:41
Цитата Сообщение от Renji Посмотреть сообщение
Но я предпочитаю чтоб они были. Только по делу, а не по отсутствию return после кидающей исключение функции.
Компилятор не телепат.
Откуда он знает бросит функция исключение, или нет?
Теоретически - может бросить. О чем и предупреждает.

Вы можете подавить предупреждение конкретно для этого участка кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
 
 //'struct test' has virtual functions and accessible non-virtual destructor [-Wnon-virtual-dtor]
    #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
    #pragma GCC diagnostic ignored "-Wreturn-type"
#endif
 
 
struct test
{
    int func()
    {
        if(value<100)
            return value;//функция может вернуть значение
        else
            error();//а может упасть с ошибкой
    }
    virtual void error(){throw 0;}
    int value;
};
 
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #pragma GCC diagnostic pop
#endif
 
//<--- в этой точке предупреждения уже не подавляются
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.02.2015, 22:42
Цитата Сообщение от Renji Посмотреть сообщение
Только по делу
Представь себе ситуацию, что некто отнаследовался от твоего класса test. Переопределил функцию error таким образом, что она перестала кидать исключения. Или стала их кидать только в некоторых ситуациях. Естественно все это произошло в другой единице трансляции. Как прикажешь компилятору об этом узнать? Так что он абсолютно по делу пишет эти предупреждения.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 22:59  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
Компилятор не телепат.
Откуда он знает бросит функция исключение, или нет?
Оттуда, что это явно прописано в attribute specifier sequence - "[[noreturn]] Indicates that the function does not return. This attribute applies to function declarations only. The behavior is undefined if the function with this attribute actually returns.".

Заметьте, речь идет не о возвращении значения, а о вызове return как такового. Не важно выбросит функция исключение, войдет в вечный цикл или еще что. Важно что она никогда не вернет управления. Поэтому, компилятор и не должен ждать какого-либо кода после вызова error. И он не ждет. Но только если error не виртуальный.
Цитата Сообщение от DrOffset Посмотреть сообщение
Представь себе ситуацию, что некто отнаследовался от твоего класса test. Переопределил функцию error таким образом, что она перестала кидать исключения. Или стала их кидать только в некоторых ситуациях. Естественно все это произошло в другой единице трансляции. Как прикажешь компилятору об этом узнать?
"The behavior is undefined if the function with this attribute actually returns.". От чужих UB я вроде страховаться не должен.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
23.02.2015, 23:00
Цитата Сообщение от Renji Посмотреть сообщение
"The behavior is undefined if the function with this attribute actually returns.". От чужих UB я вроде страховаться не должен.
Что-то ты путаешь мягкое с теплым. Твоя функция не возвращает ничего и так (void же).
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 23:03  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Что-то ты путаешь мягкое с теплым. Твоя функция не возвращает ничего и так (void же).
C++
1
2
3
4
5
[[noreturn]]void my_func()
{
   cout<<1234<<endl;
   return;//UB
}
И компилятор справедливо матюкнулся "warning: function declared 'noreturn' has a 'return' statement". Повторяю, речь идет о return как таковом, а не return что-то-там.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 23:03
Цитата Сообщение от Renji Посмотреть сообщение
Оттуда, что это явно прописано
там написано, что функции помеченная данным маркером бла бла бла

Вы пометили свою функцию int func() ?
Если нет, значит теоретически функция может вернуть управление.

И компилятор оказывает вам услугу сообщая о том, что return сработает не во всех случаях.
Вдруг вы профакапили return в одной из веток if
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.02.2015, 23:06
Цитата Сообщение от hoggy Посмотреть сообщение
int func()
* * {
* * * * if(value<100)
* * * * * * return value;//функция может вернуть значение
* * * * else
* * * * * * error();//а может упасть с ошибкой
* * }
- функция возвращает значение это значит что во всех ветках функции должно возвращатсья значение!(и в ветке ошибки, тоже, по уму возвращают код ошибки).

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2015, 23:06
Помогаю со студенческими работами здесь

virtual PC
помогите пожалуйста. хочу изучать MWServer 2003. пытаюсь запускать virtual PC на компе(wind7,home basic 32-разяд) для практики,там сообш...

virtual
Всем привет. Есть вопрос по директиве virtual. Про нее...

Virtual в С++
Здравсвуйте программисты! Скажите пожалуйста какую роль играет в классах Virtual,как его использовать и зачем . В книге про него ни чего не...

Virtual Wi Fi.
Могу ли я, создав виртуальный wi fi адаптер (Беспроводное сетевое соединение 2), подключится к какому-либо соединению Wi Fi, при условии,...

virtual pc
подскажите,вот в папке где виртуальные машины раньше была кнопка типа &quot;создать виртуальную машину&quot;,щас же её уже нет,просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru