2015-12-28 5 views
9

Я недавно начал использовать больше возможностей C++ 11 в своем коде, и мне было интересно, имеет ли место ключевое слово constexpr, независимо от того, находится ли оно до или после типа константы.Размещение ключевого слова C++ constexpr

Стиль 1:

constexpr int FOO = 1; 
constexpr auto BAR = "bar"; 

Стиль 2:

int constexpr FOO = 1; 
auto constexpr BAR = "bar"; 

Стиль 2 путь я предпочитаю, чтобы поместить const ключевое слово и размещение constexpr таким же образом принесет некоторую последовательность к коду. Тем не менее, это считается плохой практикой или что-то еще не так со стилем 2, потому что я действительно не вижу, чтобы кто-то писал это так.

ответ

10

Это спецификатор, как long, short, unsigned и т. Д. Все они могут быть перемещены. Например, следующие две эквивалентные и действительные заявления:

int long const long unsigned constexpr foo = 5; 
constexpr const unsigned long long int foo = 5; 

По соглашению, хотя, constexpr появится перед именем типа. Это может запутать других, если вы положите их после, но это технически обосновано. Поскольку constexpr выполняет другую цель, чем const, я не вижу такой же выгоды, если поместить ее вправо. Например, вы не можете сделать int constexpr * constexpr foo. Фактически, int constexpr * foo не позволит вам переназначить foo, а не применять к тому, что указывает foo, поэтому поместить его вправо может ввести в заблуждение, если вы ожидаете того же рода семантики, что и const.

Подводя итог:

int constexpr foo = 0; // valid 
int constexpr * constexpr foo = nullptr; // invalid 
int* constexpr foo = nullptr; // invalid 
int constexpr * foo = nullptr; // valid 
constexpr int* foo = nullptr; // valid and same as previous 
+0

Только о формулировках. «Все они могут быть перемещены вокруг», можно понимать как «_it не имеет значения, где вы помещаете' const'_ », что не так, поскольку оно меняет значение. – AlexD

+0

@AlexD, Правда, я бы немного упростил его. Главное было то, что они могут появляться в любом порядке до или после «базового типа» (например, «int») до тех пор, пока что-то вроде '*', где грамматика начинает становиться более конкретным. Грамматика декларации не является одной из простейших частей. – chris

+0

Несомненно. Как я уже сказал, мое замечание было всего лишь формулировкой :-). – AlexD

1

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

constexpr буквальным тип идентификатор = постоянная экспрессия; constexpr буквальным типа идентификатор {постоянная выражение}; constexpr Идентификатор литерала (params); constexpr ctor (params);

Который говорит, что вы должны использовать его слева.

Edit:

Новый Спецификатор constexpr ключевое слово является декларация спецификатор; изменить грамматику в [ISO03, §7.1] следующим образом:

1 спецификаторов, которые могут быть использованы в объявлении являются Decl-спецификатор:

хранения класса спецификатор

типа спецификатор

функции спецификатор

друг

ЬурейеЕ

constexpr

Дано объяснение для этого спецификаторам here.

Подводя итог @chris 'ответ правильный :)

Смежные вопросы