Здравствуйте, andrey.desman, Вы писали:
pva>>задам и я свой нубский вопрос: не завезли ли в с++ return void? AD>Так и не вывозили вроде...
Тьфу, и правда. Спасибо. С ходу не нагуглил, а проверить не удосужился.
Здравствуйте, Евгений Музыченко, Вы писали:
pva>> case Actions::A: return doActionA(); ЕМ>Я категорически против. Этак кто-нибудь захочет прибавить void, умножить на void...
Здорово, что ты не в комитете.
А такое, наверно, тебе вообще как соль на рану?
Здравствуйте, rg45, Вы писали:
R>чтоб при обобщенном подходе не приходилось обрабатывать функции, возвращающие void, особым случаем.
Без особых случаев все равно не обойтись. Даже если сделать универсальный шаблон с параметром T, возвращающий T, в нем без извращений не получится использовать любые операции со значениями типа T. И применять его без выделения особых случаев тоже не получится. Единственное, где все это получается без извращений — чисто "сквозной" вызов, а для него эта фича — просто синтаксический сахар.
То, что большинство не знает о наличии в языке этой фичи, лишний раз показывает, что ее ценность околонулевая.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Без особых случаев все равно не обойтись. Даже если сделать универсальный шаблон с параметром T, возвращающий T, в нем без извращений не получится использовать любые операции со значениями типа T. И применять его без выделения особых случаев тоже не получится. Единственное, где все это получается без извращений — чисто "сквозной" вызов, а для него эта фича — просто синтаксический сахар.
Пожалей сову.
ЕМ>То, что большинство не знает о наличии в языке этой фичи, лишний раз показывает, что ее ценность околонулевая.
Тебе кто-то поручал делать заявления от имени БОЛЬШИНСТВА?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, pva, Вы писали:
pva>Привет,
pva>задам и я свой нубский вопрос: не завезли ли в с++ return void?
Мало того, можно ещё в качестве параметра или результата null по ссылке передавать, разыменовывая null, предварительно кастанув его к нужному типу. Там любой указатель, с void не пробовал.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>То, что большинство не знает о наличии в языке этой фичи, лишний раз показывает, что ее ценность околонулевая.
Воинственное невежество опять вышло на тропу войны.
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 это появилось, в качестве расширения, гораздо раньше стандарта...
Здравствуйте, Pzz, Вы писали:
R>>Сделано так вполне осознанно, хотя бы для того, чтоб при обобщенном подходе не приходилось обрабатывать функции, возвращающие void, особым случаем.
Pzz>Зачем это сделано, совершенно понятно. Но я не знал, что это в стандарт уже занесли. Кажется, в gcc это появилось, в качестве расширения, гораздо раньше стандарта...
Здравствуйте, Pzz, Вы писали:
Pzz>Зачем это сделано, совершенно понятно. Но я не знал, что это в стандарт уже занесли. Кажется, в gcc это появилось, в качестве расширения, гораздо раньше стандарта...
Да, твоя правда. У меня на компе собрана полная коллекция всех стандартов, начиная с C++98, я только что пробежался по всем от начала и вижу, что данная формулировка появилась только начиная с C++17. Выходит, что до этого эта фича шла на правах расширения, причем, не только в gcc, но и в msvc (и вероятно в других компилерах тоже). Мне даже запомнилось, что достаточно давно (лет десять назад, наверное) у меня был пост на РСДН, в котором я акцентировал внимание на этой возможности.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, 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.
R>Выходит, что до этого эта фича шла на правах расширения, причем, не только в gcc, но и в msvc (и вероятно в других компилерах тоже). Мне даже запомнилось, что достаточно давно (лет десять назад, наверное) у меня был пост на РСДН, в котором я акцентировал внимание на этой возможности.
Сейчас попробовал в C++Builder 6 (а это 2002 год)
и оно там работает.
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 просто предложения перетасовали немного.
--
Справедливость выше закона. А человечность выше справедливости.
??? CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода
В данном примере, конечно ни чем. Но пример-то синтетический. А ты попробуй, например, реализовать аналог std::apply: тебе дают какую-то вызываемую сущность (функцию, лямбду или функциональный объект пользовательского класса) и список фактических параметров, запакованных в std::tuple. Тебе нужно распаковать кортеж и передать аргументы в фунционал. И вернуть нужно то, что вернул функционал — возможно ссылку, возможно значение, а возможно ничего (void).
--
Справедливость выше закона. А человечность выше справедливости.
??? CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода
Ну, выше вон отписались по поводу функциональности кода. Добавлю еще немного с колокольни codestyle.
Я в случае более одного выражения, упаковую их обычно в блок (чтобы был единый стиль если прийдется объявлять переменные внутри ветки). Приходится писать, как-то так:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, rg45, Вы писали:
R>>Тебе кто-то поручал делать заявления от имени БОЛЬШИНСТВА?
ЕМ>Ну давайте посчитаем, кто из здешних знал об этой особенности до того, как ТС поднял вопрос.
ну я думаю те, кто столкнулся хоть раз с необходимостью реализовывать свои фанкшины, чтобы какой-нибудь вызов
return (this_ptr->*f_ptr)(args...);
приводил к необходимости парсить сигнатуру (хотя все равно придется в полноценном решении) и прочие прелести именно для войд.
Здравствуйте, Pzz, Вы писали:
pva>>задам и я свой нубский вопрос: не завезли ли в с++ return void? Pzz>Это расширение gcc. Причем какое-то довольно давнишнее.
Не-а. Это всегда так было во всех компиляторах, начиная с самого начала, когда ещё даже синтаксис не устоялся.
Изначально у функции не обязательно было указывать возвращаемый тип, тогда (по умолчанию) возвращаемый тип считался int.
Более того, параметры функции можно было указать вне скобок перед телом:
foo()
int x /* <=> int foo(int x) */
{
/* код */
}
Потом добавили void, чтобы показать, что ничего не передаётся или не возвращается.
Сразу после этого многие стали писать функции без параметров так: void foo(void) и это поддерживается до сих пор, хотя void в качестве параметра почти никто не пишет.
Я не знаю точной причины зачем нужно было поддержать return foo();, но думаю, что это было сделано для удобства работы с макросами.
Здравствуйте, B0FEE664, Вы писали:
pva>>>задам и я свой нубский вопрос: не завезли ли в с++ return void? Pzz>>Это расширение gcc. Причем какое-то довольно давнишнее.
BFE>Не-а. Это всегда так было во всех компиляторах, начиная с самого начала, когда ещё даже синтаксис не устоялся.
Она далеко не всегда официально поддерживалась. И насколько я помню, она очень давно появилась, как расширение, в gcc. А вот в стандарт вошла сравнительно недавно.
BFE>Я не знаю точной причины зачем нужно было поддержать return foo();, но думаю, что это было сделано для удобства работы с макросами.
Скорее всего. Или для удобства написания прогамм, которые генерируют код на Си.
Здравствуйте, Евгений Музыченко, Вы писали:
Pzz>>в стандарт вошла сравнительно недавно.
ЕМ>Тут уже дважды писали, что в стандарте оно минимум с 2003-го.
Pzz>Она далеко не всегда официально поддерживалась. И насколько я помню, она очень давно появилась, как расширение, в gcc. А вот в стандарт вошла сравнительно недавно.
Я не могу припомнить компилятора, который не поддерживал бы эту конструкцию. Если мне не изменяет память, даже Borland'овский Turbo C++ (и, кажется, Watcom) её поддерживали. А вот поддержку return void(); добавили позже, для шаблонов.