определение переменной как автоограничение

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

char *restrict a = get_some_string( );
char *restrict b = get_some_other_string( );

(поэтому компилятор знает, что изменение a никогда не изменится bи может сделать дополнительную оптимизацию).

Если get_some_string возвращает очень сложный тип, кажется, лучше использовать auto ключевое слово;

auto a = get_some_string( );
auto b = get_some_other_string( );

Но используя auto restrict вызывает ошибку «ограничить требует указатель». Итак, как я могу объединить это?


Как отмечено в комментариях, restrict не является стандартным ключевым словом в C ++; Я забыл, что у меня есть #define restrict __restrict__ линия в моем проекте, который работает в GCC.

1

Решение

Поскольку в комментариях было предложено своего рода решение, я опубликую его здесь для дальнейшего использования; (с дополнениями, чтобы сделать его устойчивым)

typename std::remove_reference<decltype(get_some_string()[0])>::type *restrict a = get_some_string( );

Это ужасно Я буду придерживаться typedefв этих случаях, но я могу представить, что могут быть ситуации, когда такое поведение необходимо. С макросом становится немного менее страшно:

#define decltype_restrict(x) typename std::remove_reference<decltype((x)[0])>::type *restrict
decltype_restrict(get_some_string()) a = get_some_string( );
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]