Насколько я понимаю 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.
Поскольку в комментариях было предложено своего рода решение, я опубликую его здесь для дальнейшего использования; (с дополнениями, чтобы сделать его устойчивым)
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( );
Других решений пока нет …