Являются ли круглые скобки вокруг результата значимыми в операторе return?
есть ли разница между этими двумя высказываниями внутри функции?
bool returnValue = true;
//Code that does something
return(returnValue);
и этого?
bool returnValue = true;
//Code
return returnValue;
бывший в скобки returnValue
.
12 ответов:
C++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&
. разница в семантике напрямую связана с окружающими скобками.The
auto
спецификатор в его последней форме был введен в C++11. В Спецификация Языка C++ он описывается как:указывает, что тип переменной, которая объявляется будет автоматически выводится из его инициализатора. Для функций указывает, что тип возвращаемого значения является конечным тип возврата или будет выведен из его операторов return (начиная с C++14)
а также C++11 ввел
decltype
спецификатор, который описан в Язык C++ Спецификации:проверяет объявленный тип сущности или запрашивает возвращаемый тип выражения.
[snip]
если аргумент является либо непарентезированным именем объекта / функции, либо выражением доступа к элементу (object.member или pointer - >member), то decltype указывает объявленный тип сущности, заданной этим выражением.
если аргумент есть другое выражение типа T, то
a) если категория значения выражения xvalue, то decltype указывает T&&
b) если категория значения выражения lvalue, то decltype указывает T&
c) в противном случае decltype указывает T
[snip]
обратите внимание, что если имя объекта заключено в скобки, оно становится выражением lvalue, таким образом decltype (arg) и decltype ((arg)) часто бывают разных типов.
в C++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)
позволяет вывести конечный тип возврата в функции из сущности / выражения в операторе return. В первой версииreturn var1;
практически аналогично возвращает типdecltype(var1)
(anint
тип возврата по правилу 1 выше) и во втором случаеreturn (var1);
это фактически то же самое какdecltype((var1))
(anint &
тип возврата по правилу 2b).скобки делают возвращаемый тип
int&
вместоint
, таким образом, изменение семантики. мораль рассказа- "не все скобки на типе возврата создаются равными"
да, один возвращает a
bool
, в то время как другой aboo
...
после редактирования:
нет, они одинаковые.
нет никакой разницы.
одной из причин использования скобок было бы, если бы вы хотели оценить выражение перед возвратом, но в вашем примере не было бы никакой причины. Смотрите:
скобки, окружающие возвращаемые значения
для дальнейшего обсуждения.
АФАИК, ничего не изменилось.
В C++, выражения могут иметь вид:
expr
или(expr)
. Таким образом, последнее является выражением с большей типизацией. Для дальнейшего чтения об этом, обратитесь к грамматика (посмотрите на "выражение").
скобках в верхнем примере излишни; они фактически игнорируются.
Это было бы то же самое, что и что-то вроде...
int x = (5);
скобки здесь также игнорируются.
предполагаю
boo
это опечатка, и вы спрашиваете, есть ли разница междуreturn expr;
и
return(expr);
ответа нет.
нет никакой разницы между ними, хотя вы можете включить скобки, если это делает выражение легко читаемым и понятным.
вы оскорбительно замедляете компилятор!
наличие скобок не только замедляет фазу предварительной обработки, но и создает более сложное абстрактное синтаксическое дерево: больше памяти, больше вычислений.
С семантической точки зрения ? Они абсолютно идентичны. Есть ли скобки или нет
return
заявление будет в полной мере оценить выражение прежде, чем возвратить это.
они идентичны. Я вижу синтаксис скобок довольно часто, и я всегда спрашиваю тех, кто его использует: почему? И никто не может ответить, почему они используют его.
чтобы прямо подвести итог, скобки вокруг возвращаемых выражений используются людьми, которые не совсем понимают разницу между функциональными макросами и функциями или которые путают приоритет оператора или порядок правил оценки в C. нет никакой пользы от использования стиля кодирования скобка.
return value;
вернее чем
return (value)
потому что последнее предполагает, что вы не совсем знаете, что вы делаете:)