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(); добавили позже, для шаблонов.