Ссылки на статические объекты во встроенных функциях с внешней связью - PullRequest
0 голосов
/ 29 октября 2018

6.7.4 определяет как ограничение , что :

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

Так что это будет означать, что в:

#if 1 /*OK*/
int const const_global=0;
inline int ret_const_global(void) { return const_global; }
int nonconst_global=0;
inline int ret_nonconst_global(void) { return nonconst_global; }
void noop(void) { static int const const_local_static = 42;  }
#else
//constraint violations
static int const const_global=0;
inline int ret_const_global(void) { return const_global; }
static int nonconst_global=0;
inline int ret_nonconst_global(void) { return nonconst_global; }
#endif

блок #if 1 в порядке, а другой - нет.

Что я не совсем понимаю, так это то, что должна означать часть о «ссылке на идентификатор с внутренней связью».

Упоминает ли в другом случае статическую "ссылку на идентификатор с внутренней связью"?

inline int ret_const_local_static(void) { 
    static int const const_local_static = 42; 
    return const_local_static; //compiles but OK?
}

принимает статический адрес?

inline int const* ret_ref_to_const_local_static(void) { 
    static int const const_local_static = 42; 
    static int const*const ref = &const_local_static; 
    return ref;
}

Ни один из моих компиляторов не выдает диагностику для последних двух примеров (и я бы особенно хотел использовать последний, несмотря на тот факт, что я могу получить разные адреса в разных блоках компиляции, если компилятор использует встроенную версию) ) но соответствуют ли они?

Что означает "ссылка на идентификатор с внутренней связью"?

1 Ответ

0 голосов
/ 29 октября 2018

6.2.2p6 говорит:

Следующие идентификаторы не имеют связи: идентификатор, объявленный как что-либо, кроме объекта или функции; идентификатор, объявленный как параметр функции; идентификатор области блока для объекта, объявленного без спецификатора класса хранения extern.

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

...