Скобки вокруг результата значительны в заявлении о возврате?

Есть ли разница между этими двумя операторами внутри функции?

bool returnValue = true;

//Code that does something

return(returnValue);

и это?

bool returnValue = true;

//Code

return returnValue;

Первая имеет круглые скобки вокруг returnValue.

Ответ 1

С++ 14 добавляет случайный край, где круглые скобки вокруг возвращаемого значения могут изменять семантику. Этот фрагмент кода показывает две объявляемые функции. Единственное различие - это скобки вокруг возвращаемого значения.

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

В первом func1 возвращается int, а во втором func1 возвращает int&. Разница в семантике напрямую связана с окружающими круглыми скобками.

Спецификатор auto в его последней форме был введен в С++ 11. В С++ Language Spec он описывается как:

Указывает, что тип объявляемой переменной будет автоматически выведенный из его инициализатора. Для функций указывает, что тип возврата является завершающим возвращаемый тип или будет выведен из его операторов возврата (поскольку С++ 14)

Также С++ 11 представил спецификатор decltype, который описан в С++ Language Spec:

Проверяет объявленный тип объекта или запрашивает тип возвращаемого выражения. [Надрез] 1. Если аргумент является либо нерасширенным именем объекта/функции, либо является выражением доступа к члену (object.member или pointer- > ), тогда decltype указывает объявленный тип объекта, указанный этим выражением.

  • Если аргументом является любое другое выражение типа T, то

    a), если категория значений выражения равна xvalue, тогда decltype указывает T &&

    b), если категория значений выражения равна lvalue, тогда decltype указывает T &

    c) в противном случае decltype указывает T

[надрез]

Обратите внимание: если имя объекта заключено в скобки, оно становится выражением lvalue, поэтому decltype (arg) и decltype ((arg)) часто являются разными типами.

В С++ 14 возможность использования decltype(auto) была разрешена для типов возвращаемых функций. Исходные примеры - это то, где вступает в действие семантическая разница с круглыми скобками. Пересмотр исходных примеров:

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

decltype(auto) позволяет возвращать возвращаемый тип возвращаемой функции из выражения entity/expression в операторе return. В первой версии return var1; фактически совпадает с возвратом типа decltype(var1) (a int типа возврата по правилу 1 выше), а во втором случае return (var1); он фактически совпадает с decltype((var1)) (an возвращаемый тип по правилу 2b).

Скобки создают тип возвращаемого значения int& вместо int, таким образом изменяя семантику. Мораль истории - "Не все круглые скобки на возвращаемом типе созданы равными"

Ответ 2

Да, возвращается bool, а другой a boo...


После редактирования:

нет, они одинаковы.

Ответ 3

Нет никакой разницы.

Одной из причин использования скобок было бы, если бы вы хотели оценить выражение перед возвратом, но в вашем примере не было бы причин. См:

Значения возвращаемых значений округления

для дальнейшего обсуждения.

Ответ 4

Скобки в верхнем примере являются излишними; они фактически игнорируются.

Это будет то же самое, что...

int x = (5);

Здесь также игнорируются скобки.

Ответ 5

AFAIK, ничего не изменилось.

В С++ выражения могут иметь форму: expr или (expr). Таким образом, последнее является выражением с более типизированным. Для дальнейшего ознакомления с этим обратитесь к грамматике (найдите "выражение" ).

Ответ 6

Вы злоупотребляете компилятором!

Наличие скобок не только замедляет фазу предварительной обработки, но и генерирует более сложное абстрактное дерево синтаксиса: больше памяти, больше вычислений.


С семантической точки зрения? Они точно идентичны. Будут ли скобки или нет, оператор return полностью оценит выражение перед его возвратом.

Ответ 7

Нет, в вашем коде нет разницы.

Ответ 8

Я предполагаю, что boo является опечаткой, и вы спрашиваете, есть ли разница между

return expr;

и

return(expr);

Ответ - нет.

Ответ 9

Они идентичны. Я вижу синтаксис скобок довольно часто, и я всегда спрашиваю тех, кто его использует: почему? И никто не может ответить, почему они его используют.

Чтобы прямо подвести итог, круглые скобки вокруг возвращающих выражений используются людьми, которые не совсем понимают разницу между функционально подобными макросами и функциями или смущены в отношении приоритета или порядка оценки правил в C. Там не использует стиль кодирования при использовании скобок.

Таким образом,

return value;

вернее, чем

return (value)

потому что последнее предполагает, что вы не совсем знаете, что делаете:)

Ответ 10

Нет никакой разницы между ними, хотя вы можете включить скобки, если это облегчает чтение и очистку выражения.

Ответ 11

Никакой разницы!

Люди используют скобки, если есть сложное выражение.

BTW return - это оператор, а не функция.

Ответ 12

Оба в вашем случае одинаковы.