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;
}
Ни один из моих компиляторов не выдает диагностику для последних двух примеров (и я бы особенно хотел использовать последний, несмотря на тот факт, что я могу получить разные адреса в разных блоках компиляции, если компилятор использует встроенную версию) ) но соответствуют ли они?
Что означает "ссылка на идентификатор с внутренней связью"?