return void
От: pva  
Дата: 13.06.23 15:28
Оценка:
Привет,

задам и я свой нубский вопрос: не завезли ли в с++ return void?
Ну, чтобы наконец-то вроде такого
void doActionA() {}
void doActionB() {}

void dispatch(Actions action) {
  switch (action) {
     case Actions::A: return doActionA();
     case Actions::B: return doActionB();
  }
}
newbie
Re: return void
От: andrey.desman  
Дата: 13.06.23 15:34
Оценка: 3 (1) +6 :))
Здравствуйте, pva, Вы писали:

pva>задам и я свой нубский вопрос: не завезли ли в с++ return void?


Так и не вывозили вроде...
Re[2]: return void
От: pva  
Дата: 13.06.23 15:47
Оценка:
Здравствуйте, andrey.desman, Вы писали:

pva>>задам и я свой нубский вопрос: не завезли ли в с++ return void?

AD>Так и не вывозили вроде...
Тьфу, и правда. Спасибо. С ходу не нагуглил, а проверить не удосужился.
newbie
Re: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.06.23 17:59
Оценка: :))) :))) :)
Здравствуйте, pva, Вы писали:

pva> case Actions::A: return doActionA();


Я категорически против. Этак кто-нибудь захочет прибавить void, умножить на void...
Re[2]: return void
От: rg45 СССР  
Дата: 13.06.23 18:19
Оценка: +3
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я категорически против. Этак кто-нибудь захочет прибавить void, умножить на void...


Ну, напиши в Спортлото.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: return void
От: pva  
Дата: 13.06.23 19:43
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

pva>> case Actions::A: return doActionA();

ЕМ>Я категорически против. Этак кто-нибудь захочет прибавить void, умножить на void...
Здорово, что ты не в комитете.
А такое, наверно, тебе вообще как соль на рану?
int A() { return 0; }

void B() {
  return (void) A();
}

bool C() {
  return B(), true;
}
newbie
Re[3]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.06.23 19:55
Оценка: +1
Здравствуйте, pva, Вы писали:

pva>такое, наверно, тебе вообще как соль на рану?


Оно просто ни к чему.
Re: return void
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.06.23 23:57
Оценка:
Здравствуйте, pva, Вы писали:

pva>задам и я свой нубский вопрос: не завезли ли в с++ return void?


Это расширение gcc. Причем какое-то довольно давнишнее.
Re[2]: return void
От: rg45 СССР  
Дата: 14.06.23 07:06
Оценка: +4
Здравствуйте, Pzz, Вы писали:

Pzz>Это расширение gcc. Причем какое-то довольно давнишнее.


Никакое это не расширение, не нужно выдумывать:

https://timsong-cpp.github.io/cppwp/stmt.return#2

A return statement with an operand of type void shall be used only in a function that has a cv void return type.


Сделано так вполне осознанно, хотя бы для того, чтоб при обобщенном подходе не приходилось обрабатывать функции, возвращающие void, особым случаем.
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.06.23 07:17
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>чтоб при обобщенном подходе не приходилось обрабатывать функции, возвращающие void, особым случаем.


Без особых случаев все равно не обойтись. Даже если сделать универсальный шаблон с параметром T, возвращающий T, в нем без извращений не получится использовать любые операции со значениями типа T. И применять его без выделения особых случаев тоже не получится. Единственное, где все это получается без извращений — чисто "сквозной" вызов, а для него эта фича — просто синтаксический сахар.

То, что большинство не знает о наличии в языке этой фичи, лишний раз показывает, что ее ценность околонулевая.
Re[4]: return void
От: rg45 СССР  
Дата: 14.06.23 07:18
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Без особых случаев все равно не обойтись. Даже если сделать универсальный шаблон с параметром T, возвращающий T, в нем без извращений не получится использовать любые операции со значениями типа T. И применять его без выделения особых случаев тоже не получится. Единственное, где все это получается без извращений — чисто "сквозной" вызов, а для него эта фича — просто синтаксический сахар.


Пожалей сову.

ЕМ>То, что большинство не знает о наличии в языке этой фичи, лишний раз показывает, что ее ценность околонулевая.


Тебе кто-то поручал делать заявления от имени БОЛЬШИНСТВА?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 14.06.2023 7:21 rg45 . Предыдущая версия .
Re[5]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.06.23 07:23
Оценка:
Здравствуйте, rg45, Вы писали:

R>Тебе кто-то поручал делать заявления от имени БОЛЬШИНСТВА?


Ну давайте посчитаем, кто из здешних знал об этой особенности до того, как ТС поднял вопрос.
Re: return void
От: Maniacal Россия  
Дата: 14.06.23 07:25
Оценка:
Здравствуйте, pva, Вы писали:

pva>Привет,


pva>задам и я свой нубский вопрос: не завезли ли в с++ return void?


Мало того, можно ещё в качестве параметра или результата null по ссылке передавать, разыменовывая null, предварительно кастанув его к нужному типу. Там любой указатель, с void не пробовал.
Re[6]: return void
От: rg45 СССР  
Дата: 14.06.23 07:29
Оценка: +2 :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Ну давайте посчитаем, кто из здешних знал об этой особенности до того, как ТС поднял вопрос.


Вот ты бы посчитал сперва, а потом бы уже делал заявления. У тебя же телега впереди лошади, как обычно.
--
Справедливость выше закона. А человечность выше справедливости.
Re[6]: Че ты лыбишься?
От: rg45 СССР  
Дата: 14.06.23 07:35
Оценка: :)
Ты завления делаешь, тебе и за базар отвечать. Как ты это будешь делать — считать, или рисовать — это твое дело, мне фиолетово.
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: return void
От: serg_joker Украина  
Дата: 14.06.23 16:30
Оценка: +6 :))
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>То, что большинство не знает о наличии в языке этой фичи, лишний раз показывает, что ее ценность околонулевая.

Воинственное невежество опять вышло на тропу войны.
Re[3]: return void
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.06.23 11:08
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>

R>A return statement with an operand of type void shall be used only in a function that has a cv void return type.


R>Сделано так вполне осознанно, хотя бы для того, чтоб при обобщенном подходе не приходилось обрабатывать функции, возвращающие void, особым случаем.


Зачем это сделано, совершенно понятно. Но я не знал, что это в стандарт уже занесли. Кажется, в gcc это появилось, в качестве расширения, гораздо раньше стандарта...
Re[4]: return void
От: пффф  
Дата: 15.06.23 11:25
Оценка:
Здравствуйте, Pzz, Вы писали:

R>>Сделано так вполне осознанно, хотя бы для того, чтоб при обобщенном подходе не приходилось обрабатывать функции, возвращающие void, особым случаем.


Pzz>Зачем это сделано, совершенно понятно. Но я не знал, что это в стандарт уже занесли. Кажется, в gcc это появилось, в качестве расширения, гораздо раньше стандарта...


Емнип, всегда было, и в сишечке тоже
https://gcc.godbolt.org/z/o4Yfx3Gvr
Re[4]: return void
От: rg45 СССР  
Дата: 15.06.23 12:13
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Зачем это сделано, совершенно понятно. Но я не знал, что это в стандарт уже занесли. Кажется, в gcc это появилось, в качестве расширения, гораздо раньше стандарта...


Да, твоя правда. У меня на компе собрана полная коллекция всех стандартов, начиная с C++98, я только что пробежался по всем от начала и вижу, что данная формулировка появилась только начиная с C++17. Выходит, что до этого эта фича шла на правах расширения, причем, не только в gcc, но и в msvc (и вероятно в других компилерах тоже). Мне даже запомнилось, что достаточно давно (лет десять назад, наверное) у меня был пост на РСДН, в котором я акцентировал внимание на этой возможности.
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: return void
От: andrey.desman  
Дата: 15.06.23 12:23
Оценка: 8 (1) :)
Здравствуйте, rg45, Вы писали:

R>Да, твоя правда. У меня на компе собрана полная коллекция всех стандартов, начиная с C++98, я только что пробежался по всем от начала и вижу, что данная формулировка появилась только начиная с C++17. Выходит, что до этого эта фича шла на правах расширения, причем, не только в gcc, но и в msvc (и вероятно в других компилерах тоже). Мне даже запомнилось, что достаточно давно (лет десять назад, наверное) у меня был пост на РСДН, в котором я акцентировал внимание на этой возможности.


2005 год.

3.9.1 Fundamental types
The void type has an empty set of values. The void type is an incomplete type that cannot be completed. It is used as
the return type for functions that do not return a value. Any expression can be explicitly converted to type cv void (5.4).
An expression of type void shall be used only as an expression statement (6.2), as an operand of a comma expression
(5.18), as a second or third operand of ?: (5.16), as the operand of typeid, or as the expression in a return statement
(6.6.3) for a function with the return type void.


6.6.3 The return statement [stmt.return]
3 A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the
expression is evaluated just before the function returns to its caller.

Отредактировано 15.06.2023 12:29 andrey.desman . Предыдущая версия . Еще …
Отредактировано 15.06.2023 12:27 andrey.desman . Предыдущая версия .
Re[5]: return void
От: CRT  
Дата: 15.06.23 12:24
Оценка:
Здравствуйте, rg45, Вы писали:


R>Выходит, что до этого эта фича шла на правах расширения, причем, не только в gcc, но и в msvc (и вероятно в других компилерах тоже). Мне даже запомнилось, что достаточно давно (лет десять назад, наверное) у меня был пост на РСДН, в котором я акцентировал внимание на этой возможности.


Сейчас попробовал в C++Builder 6 (а это 2002 год)
и оно там работает.
Re[6]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.06.23 12:32
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>2005 год.


В ISO/IEC 14882 Second edition (2003-10-15) — то же самое.
Re[6]: return void
От: rg45 СССР  
Дата: 15.06.23 12:34
Оценка:
Здравствуйте, andrey.desman, Вы писали:


AD>2005 год.


AD>

AD>3.9.1 Fundamental types
AD>The void type has an empty set of values. The void type is an incomplete type that cannot be completed. It is used as
AD>the return type for functions that do not return a value. Any expression can be explicitly converted to type cv void (5.4).
AD>An expression of type void shall be used only as an expression statement (6.2), as an operand of a comma expression
AD>(5.18), as a second or third operand of ?: (5.16), as the operand of typeid, or as the expression in a return statement
AD>(6.6.3) for a function with the return type void.


AD>6.6.3 The return statement [stmt.return]
AD>3 A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the
AD>expression is evaluated just before the function returns to its caller.


Фу, блин, ну я и слепошара. Это же самое есть даже в С++98, в этих же самых пунктах и формулировках. Начиная с C+17 просто предложения перетасовали немного.
--
Справедливость выше закона. А человечность выше справедливости.
Re: return void
От: CRT  
Дата: 15.06.23 12:36
Оценка: 18 (1) +1
Здравствуйте, pva, Вы писали:
pva>Ну, чтобы наконец-то вроде такого
pva>
pva>void doActionA() {}
pva>void doActionB() {}
pva>void dispatch(Actions action) {
pva>  switch (action) {
pva>     case Actions::A: return doActionA();
pva>     case Actions::B: return doActionB();
pva>  }
pva>}
pva>


И чем это лучше чем
void dispatch(Actions action) {
  switch (action) {
    case Actions::A: doActionA(); return;
    case Actions::B: doActionB(); return;
  }
}
???
По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода
Отредактировано 15.06.2023 12:51 CRT . Предыдущая версия . Еще …
Отредактировано 15.06.2023 12:36 CRT . Предыдущая версия .
Re[2]: return void
От: rg45 СССР  
Дата: 15.06.23 14:16
Оценка: +4
Здравствуйте, CRT, Вы писали:

CRT>И чем это лучше чем

CRT>
CRT>void dispatch(Actions action) {
CRT>  switch (action) {
CRT>    case Actions::A: doActionA(); return;
CRT>    case Actions::B: doActionB(); return;
CRT>  }
CRT>}
CRT>
???

CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода

В данном примере, конечно ни чем. Но пример-то синтетический. А ты попробуй, например, реализовать аналог std::apply: тебе дают какую-то вызываемую сущность (функцию, лямбду или функциональный объект пользовательского класса) и список фактических параметров, запакованных в std::tuple. Тебе нужно распаковать кортеж и передать аргументы в фунционал. И вернуть нужно то, что вернул функционал — возможно ссылку, возможно значение, а возможно ничего (void).
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 15.06.2023 14:43 rg45 . Предыдущая версия . Еще …
Отредактировано 15.06.2023 14:26 rg45 . Предыдущая версия .
Отредактировано 15.06.2023 14:24 rg45 . Предыдущая версия .
Отредактировано 15.06.2023 14:21 rg45 . Предыдущая версия .
Re[2]: return void
От: pva  
Дата: 15.06.23 17:01
Оценка:
Здравствуйте, CRT, Вы писали:

CRT>И чем это лучше чем

CRT>
CRT>void dispatch(Actions action) {
CRT>  switch (action) {
CRT>    case Actions::A: doActionA(); return;
CRT>    case Actions::B: doActionB(); return;
CRT>  }
CRT>}
CRT>
???

CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода

Ну, выше вон отписались по поводу функциональности кода. Добавлю еще немного с колокольни codestyle.
Я в случае более одного выражения, упаковую их обычно в блок (чтобы был единый стиль если прийдется объявлять переменные внутри ветки). Приходится писать, как-то так:
void dispatch(Actions action) {
  switch (action) {
    case Actions::A: {
      doActionA();
      return;
    }
    case Actions::B: {
      doActionB();
      return;
    }
  }
}


А если у нас веток 10+, то пока листаешь пару экранов — забываешь чего там в начале было. Память уже не та.
newbie
Отредактировано 15.06.2023 17:02 pva . Предыдущая версия .
Re[2]: return void
От: Mr.Delphist  
Дата: 15.06.23 22:34
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я категорически против. Этак кто-нибудь захочет прибавить void, умножить на void...


Void там давно умножают, особенно в malloc
Re[6]: return void
От: ребусоид Интернет https://youtu.be/I3lhN5CUP2M
Дата: 02.07.23 12:10
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, rg45, Вы писали:


R>>Тебе кто-то поручал делать заявления от имени БОЛЬШИНСТВА?


ЕМ>Ну давайте посчитаем, кто из здешних знал об этой особенности до того, как ТС поднял вопрос.

ну я думаю те, кто столкнулся хоть раз с необходимостью реализовывать свои фанкшины, чтобы какой-нибудь вызов
return (this_ptr->*f_ptr)(args...);
приводил к необходимости парсить сигнатуру (хотя все равно придется в полноценном решении) и прочие прелести именно для войд.
Re[2]: return void
От: B0FEE664  
Дата: 03.07.23 10:30
Оценка:
Здравствуйте, Pzz, Вы писали:

pva>>задам и я свой нубский вопрос: не завезли ли в с++ return void?

Pzz>Это расширение gcc. Причем какое-то довольно давнишнее.

Не-а. Это всегда так было во всех компиляторах, начиная с самого начала, когда ещё даже синтаксис не устоялся.
Изначально у функции не обязательно было указывать возвращаемый тип, тогда (по умолчанию) возвращаемый тип считался int.
Более того, параметры функции можно было указать вне скобок перед телом:
foo()
int x  /* <=> int foo(int x) */
{
  /* код */
}

Потом добавили void, чтобы показать, что ничего не передаётся или не возвращается.
Сразу после этого многие стали писать функции без параметров так: void foo(void) и это поддерживается до сих пор, хотя void в качестве параметра почти никто не пишет.

Я не знаю точной причины зачем нужно было поддержать return foo();, но думаю, что это было сделано для удобства работы с макросами.
И каждый день — без права на ошибку...
Re[2]: return void
От: B0FEE664  
Дата: 03.07.23 10:33
Оценка:
Здравствуйте, CRT, Вы писали:

  Скрытый текст
pva>>Ну, чтобы наконец-то вроде такого
pva>>
pva>>void doActionA() {}
pva>>void doActionB() {}
pva>>void dispatch(Actions action) {
pva>>  switch (action) {
pva>>     case Actions::A: return doActionA();
pva>>     case Actions::B: return doActionB();
pva>>  }
pva>>}
pva>>


CRT>И чем это лучше чем

CRT>
CRT>void dispatch(Actions action) {
CRT>  switch (action) {
CRT>    case Actions::A: doActionA(); return;
CRT>    case Actions::B: doActionB(); return;
CRT>  }
CRT>}
CRT>
???

CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода

В случае return doActionA(); есть гарантия, что dispatch() возвращает результат согласованный с результатом doActionA().
И каждый день — без права на ошибку...
Re[3]: return void
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.07.23 20:18
Оценка:
Здравствуйте, B0FEE664, Вы писали:

pva>>>задам и я свой нубский вопрос: не завезли ли в с++ return void?

Pzz>>Это расширение gcc. Причем какое-то довольно давнишнее.

BFE>Не-а. Это всегда так было во всех компиляторах, начиная с самого начала, когда ещё даже синтаксис не устоялся.


Мы говорим про совершенно конкретную конструкцию:

void foo(void) {
}

void bar(void) {
    return foo();
}


Она далеко не всегда официально поддерживалась. И насколько я помню, она очень давно появилась, как расширение, в gcc. А вот в стандарт вошла сравнительно недавно.

BFE>Я не знаю точной причины зачем нужно было поддержать return foo();, но думаю, что это было сделано для удобства работы с макросами.


Скорее всего. Или для удобства написания прогамм, которые генерируют код на Си.
Re[4]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.07.23 10:50
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>в стандарт вошла сравнительно недавно.


Тут уже дважды писали, что в стандарте оно минимум с 2003-го.
Re[5]: return void
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.07.23 10:51
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Pzz>>в стандарт вошла сравнительно недавно.


ЕМ>Тут уже дважды писали, что в стандарте оно минимум с 2003-го.


Дык для меня 2003-й — это "сравнительно недавно"
Re[4]: return void
От: B0FEE664  
Дата: 04.07.23 12:44
Оценка:
Здравствуйте, Pzz, Вы писали:

Мы говорим про совершенно конкретную конструкцию:
  Скрытый текст
Pzz>
Pzz>void foo(void) {
Pzz>}

Pzz>void bar(void) {
Pzz>    return foo();
Pzz>}
Pzz>

Pzz>Она далеко не всегда официально поддерживалась. И насколько я помню, она очень давно появилась, как расширение, в gcc. А вот в стандарт вошла сравнительно недавно.

Я не могу припомнить компилятора, который не поддерживал бы эту конструкцию. Если мне не изменяет память, даже Borland'овский Turbo C++ (и, кажется, Watcom) её поддерживали. А вот поддержку return void(); добавили позже, для шаблонов.
И каждый день — без права на ошибку...
Re[6]: return void
От: rg45 СССР  
Дата: 04.07.23 13:07
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Дык для меня 2003-й — это "сравнительно недавно"


На самом деле, с 98-го. Давнее уже не придумаешь
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.