Являются ли круглые скобки вокруг результата значимыми в операторе return?


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

bool returnValue = true;

//Code that does something

return(returnValue);

и этого?

bool returnValue = true;

//Code

return returnValue;

бывший в скобки returnValue.

12 52

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]

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

  2. если аргумент есть другое выражение типа 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) (an int тип возврата по правилу 1 выше) и во втором случае return (var1); это фактически то же самое как decltype((var1)) (an int & тип возврата по правилу 2b).

скобки делают возвращаемый тип int& вместо int, таким образом, изменение семантики. мораль рассказа- "не все скобки на типе возврата создаются равными"

да, один возвращает a bool, в то время как другой a boo...


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

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

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

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

скобки, окружающие возвращаемые значения

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

АФАИК, ничего не изменилось.

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

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

Это было бы то же самое, что и что-то вроде...

int x = (5);

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

нет, нет никакой разницы в коде.

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

return expr;

и

return(expr);

ответа нет.

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

вы оскорбительно замедляете компилятор!

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


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

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

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

return value;

вернее чем

return (value)

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

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

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

кстати return Это оператор, а не функция.

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