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

Virtual и noreturn

23.02.2015, 19:57. Показов 11159. Ответов 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
23.02.2015, 23:08
Студворк — интернет-сервис помощи студентам

Не по теме:

Renji, ты честно заслужил свой минус такими вопросами. Жалуйся хоть Путину.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 23:10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- функция возвращает значение это значит что во всех ветках функции должно возвращатсья значение!(и в ветке ошибки, тоже, по уму возвращают код ошибки).
зачем вы мне это объясняете?
объясните это господину Renji
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.02.2015, 23:12
hoggy, я объяснял это автору темы, если выделил твой код(там в постах он часто мелькает, может и спутал) - это без какой либо подоплёки.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 23:15  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- функция возвращает значение это значит что во всех ветках функции должно возвращатсья значение!(и в ветке ошибки, тоже, по уму возвращают код ошибки).
C++
1
2
3
4
5
6
7
int func()
{
    if(value<100)
        throw std::runtime_error("какой вам к черту код ошибки? Какой к черту return после этой строчки? Извините, за резкость");
        //error();делающий тоже самое что строчка выше
    return 0;
}
Цитата Сообщение от hoggy Посмотреть сообщение
И компилятор оказывает вам услугу сообщая о том, что return сработает не во всех случаях.
Вдруг вы профакапили return в одной из веток if
Нет, компилятор проверяет ветки if и сообщает что в одной из них не нашел return. Хотя, он там нашел noreturn функцию.

Понимаете, если бы компилятор игнорировал noreturn начисто, ну и черт с ним. Я не пойму почему он игнорирует noreturn только в сочетании с virtual. Ну ведь без virtual он варнингами не срет же.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.02.2015, 23:19
Цитата Сообщение от Renji Посмотреть сообщение
Повторяю, речь идет о return как таковом, а не return что-то-там.
Renji, Ок, ладно, я плохо прочел документацию. Тут ты прав.
Но это не важно. Давай разбираться, атрибут [[noreturn]] входит в сигнатуру функции? Насколько я вижу - нет. О чем тогда речь? Переопределенная функция - это уже другая функция и всякие варианты про UB на нее не распространяются. Пометь виртуальную функцию как final и warning пропадет.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.02.2015, 23:20
Цитата Сообщение от Renji Посмотреть сообщение
throw std::runtime_error("какой вам к черту код ошибки? Какой к черту return после этой строчки? Извините, за резкость");
* * * * //error();делающий тоже самое что строчка выше
- ну умеешь номрально выстроить код чтобы возвращать во всех ветках и кидать код ошибки, после чего подхватывать обработчиком - это ТВОИ ПРОБЛЕМЫ! и нефик спорить, тебе пишут как правильно, а не как ты хочешь, будь добр принять это как догму: в функции с возвратом - обязаетлено следует вернуть результат ВО ВСЕХ ВЕТВЯХ всегда.

Не по теме:

Это как м@ть его вместо void main следует писать int main

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.02.2015, 23:20
Цитата Сообщение от Renji Посмотреть сообщение
Хотя, он там нашел noreturn функцию.
Нет. Не нашел.

Нашел бы - не кидал бы ворнинги.

Цитата Сообщение от Renji Посмотреть сообщение
игнорирует noreturn только в сочетании с virtual.
В сочетании с virtual он не знает какая именно версия функции будет вызвана.
Она ж виртуальная.

Соответственно, он уже не может закладываться на то, что будет вызвана именно та, что с меткой noreturn

Соответственно, он как хороший товарищ на всякий случай предупреждает программиста: здесь канитель может выйти.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.02.2015, 23:33  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Но это не важно. Давай разбираться, атрибут [[noreturn]] входит в сигнатуру функции? Насколько я вижу - нет. О чем тогда речь?
Вот я и спрашиваю, как запихать в сигнатуру error И virtual, И [[noreturn]]. Обязуюсь повторять этот [[noreturn]] в каждом переопределении error, не вопрос. И вообще, если noreturn не часть сигнатуры, где варнинг "attribute ignored [-Wattributes]"?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ну умеешь номрально выстроить код чтобы возвращать во всех ветках и кидать код ошибки, после чего подхватывать обработчиком - это ТВОИ ПРОБЛЕМЫ!
И как же месье представляет себе возврат чего-то там после throw/любой noreturn функции типа std::exit? Каким мистическим путем управление до этого возврата дойдет то? Не, раньше была догма что нужно подписывать после таких throw чисто формальный return 1234. Но вот именно для ее отмены noreturn и ввели.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
23.02.2015, 23:54
Цитата Сообщение от Renji Посмотреть сообщение
Вот я и спрашиваю, как запихать в сигнатуру error И virtual, И [[noreturn]]. Обязуюсь повторять этот [[noreturn]] в каждом переопределении error, не вопрос.
Можно воспользоваться паттерном non-virtual interface.
C++
1
2
3
4
5
6
7
struct test
{
    int func(){ nv_error(); }
    
    [[noreturn]] void nv_error() { this->error(); }
    [[noreturn]] virtual void error();
};
Цитата Сообщение от Renji Посмотреть сообщение
И вообще, если noreturn не часть сигнатуры, где варнинг "attribute ignored [-Wattributes]"?
А он должен быть? Про сигнатуру я сказал к тому, что функция переопределяется по сигнатуре. Если бы можно было по этому атрибуту перегружать функции вот так:
C++
1
2
    [[noreturn]] virtual void error();
    virtual void error();
то тогда однозначно атрибут часть сигнатуры и значит при наследовании у всех переопределенных функций он тоже должен присутствовать. Но этого не происходит, значит в сигнатуру атрибуты не входят. А warning про игнорирование атрибута применим только, если атрибут у функции присутствует, но игнорируется. Но здесь, очевидно, другой случай, т.к. у наследника в его версии функции этого атрибута нет вообще.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.02.2015, 00:07  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно воспользоваться паттерном non-virtual interface.
Спасибо, помогло. Хотя это не так удобно как хотелось бы.
Цитата Сообщение от DrOffset Посмотреть сообщение
А он должен быть? Про сигнатуру я сказал к тому, что функция переопределяется по сигнатуре. Если бы можно было по этому атрибуту перегружать функции вот так:
noexcept то в сигнатуру входит. По крайней мере, если объявить виртуальную функцию noexcept, тоже самое потребуют и от всех ее переопределений. А то что перегружать по noreturn нельзя, так и по типу возвращаемого значения нельзя. Но тип возвращаемого значения вроде как опять-же часть сигнатуры.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.02.2015, 00:13
Цитата Сообщение от Renji Посмотреть сообщение
noexcept то в сигнатуру входит.
Вы ошибаетесь.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
24.02.2015, 09:18
Renji, вот так свой код построй и не парь мозг людям.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int func(int val){
    if( 100 <= val )
        throw logic_error("Я не знаю C++!");
    return val;
}
 
int main(){
    int val = 0;
    try{
        val = func(100);
    }
    catch(const std::exception& e){
       cout << e.what();
    }
    return 0;
}
Output:
Я не знаю C++!
http://codepad.org/h4peGdUW

Добавлено через 2 минуты

Не по теме:

Ещё раз, для тех кто в танке, либо делаем возврат кода ошибки(и делаем этот возврат во всех ветках), либо генерируем эксепшн по условию в таком случае возврат всегда вконцце. Также не гененрируем эксепшины в коснтрукторе, за это тоже надо пулю в лоб. Порождаем объект и кидаем эксепшн в методе инициалайз, который успешно пишем своими руками.

0
 Аватар для Voivoid
710 / 284 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
24.02.2015, 10:00
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Также не гененрируем эксепшины в коснтрукторе, за это тоже надо пулю в лоб. Порождаем объект и кидаем эксепшн в методе инициалайз, который успешно пишем своими руками.

Не по теме:

Или ты пишешь под symbian, или у меня для тебя плохие новости :)

0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.02.2015, 15:00  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Renji, вот так свой код построй и не парь мозг людям.
Месье не читает дискуссию или не может признать что спорол глупость? Еще раз, для тех кто в танке: обсуждаемый метод error предназначен для выкидывания исключения. Это полный эквивалент throw только короче.
C++
1
2
3
4
5
6
7
8
9
[[noreturn]]void error(){
    throw std::runtime_error("длинная-длинная строчка, меня задолбало ее по три раза набивать. Нет, многомудрые советчики, я НЕ буду набирать ее по три раза лишь для удобства тупого компилятора");
}
int func(int val)
{
    if(val>100)
        error();
    return val;
}
0
24.02.2015, 21:32

Не по теме:

Renji, чем теперь втой код отличается от этого

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int func(int val){
* * if( 100 <= val )
* * * * throw logic_error("Я не знаю C++!");
* * return val;
}
- В итоге я тебе показал как сделать всё без тупых веток,
но нет скопипастил и теперь выставляешь своим.
Дорогой, ты вот что хотел
if( valid )
return value;
else
error();
я тебе написал что это дебилизм. Загляни в свою душу и посмотри кто из нас тут прав.
ЗЫ:Voivoid, иди в те дебри из которых ты вылез:-!, мне не интересны задиристые нубы

0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.02.2015, 21:40  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Renji, чем теперь втой код отличается от этого
Тем что в моем коде будет десять вызовов error(), а в твоем - десять вызовов throw std::runtime_error("ну не могу я признать что сморозил глупость");. А когда потребуется изменить формат строки в исключении... Ну, счастливой тебе беготни с "найти-заменить" по всему коду.
1
24.02.2015, 21:43

Не по теме:

Renji, омг какой же ты "неострый". удачи желать не буду

0
24.02.2015, 22:18

Не по теме:

-=ЮрА=-, вы же вроде взрослый человек и профессионал, зачем же всем так грубить?

0
24.02.2015, 22:52

Не по теме:

Людвиг Бодмер, а зачем мне все грубят(притом я пытаюсь помочь а мне в глаза с*уt?), хоть в одной теме я первый сказал что то обидное, а уже после общения с тем или иным пользователем просто адекватно отвечаю.
Не помню кто сказал : люди очень часто сами ведут себя по-хамски, а потом удивляются, что им отвечают тем же.

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.02.2015, 10:31
-=ЮрА=-,

Не по теме:

Потому что ты несешь фигню. Тебе про одно, ты про другое.

Это не бред, noreturn новый аттрибут в стандарте С++11, если ты про него не знаешь - просто не отвечай, зачем убеждать человека, что ему это не нужно, если он спросил почему это не работает?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2015, 10:31

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;,щас же её уже нет,просто...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru