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

Virtual и noreturn

23.02.2015, 19:57. Показов 11043. Ответов 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 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
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 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
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 / 283 / 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
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru