'static constexpr auto' в качестве алиаса функции
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.09.18 20:46
Оценка:
привет!

встретил в некотором коде такой трюк:
int impl_func(int) {}

namespace myns {
    static constexpr auto func = impl_func;
}

пример сильно упрощен, но суть отражает полностью.

мой вопрос в том, насколько это "стандартно" и какие возможны побочные эфекты?


спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 04.09.2018 20:48 niXman . Предыдущая версия . Еще …
Отредактировано 04.09.2018 20:47 niXman . Предыдущая версия .
Re: 'static constexpr auto' в качестве алиаса функции
От: watchmaker  
Дата: 04.09.18 22:12
Оценка: +2 :)
Здравствуйте, niXman, Вы писали:


X> суть отражает полностью.

X>мой вопрос в том, насколько это "стандартно"

Это не алиас, это — указатель на функцию. Конструкция старая, как само программирование. И в C++ оно было всегда.
Отредактировано 04.09.2018 22:13 watchmaker . Предыдущая версия .
Re: 'static constexpr auto' в качестве алиаса функции
От: Vamp Россия  
Дата: 04.09.18 22:56
Оценка:
Здравствуйте, niXman, Вы писали:

X>привет!


X>встретил в некотором коде такой трюк:

X>
X>int impl_func(int) {}

X>namespace myns {
X>    static constexpr auto func = impl_func;
X>}
X>

X>пример сильно упрощен, но суть отражает полностью.

X>мой вопрос в том, насколько это "стандартно" и какие возможны побочные эфекты?



X>спасибо.

Не вижу трюка. Вижу код, в котором указатель на функцию помещен в пространство имен. Зачем — из приведенного фрагмента не понять.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: 'static constexpr auto' в качестве алиаса функции
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.09.18 23:37
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Это не алиас, это — указатель на функцию. Конструкция старая, как само программирование. И в C++ оно было всегда.


ну да)
меня синтаксис запутал, потому что используется auto, подумал что это что-то новое %)

так а constexpr тут вообще нужен?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: 'static constexpr auto' в качестве алиаса функции
От: Vamp Россия  
Дата: 04.09.18 23:49
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, watchmaker, Вы писали:


W>>Это не алиас, это — указатель на функцию. Конструкция старая, как само программирование. И в C++ оно было всегда.


X>ну да)

X>меня синтаксис запутал, потому что используется auto, подумал что это что-то новое %)

X>так а constexpr тут вообще нужен?

Да, иначе его не определить в хедере, а если его не определить в хедере, то вызов по нему может оказаться непрямым.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: 'static constexpr auto' в качестве алиаса функции
От: SomeOne_TT  
Дата: 05.09.18 07:18
Оценка:
Здравствуйте, Vamp, Вы писали:


X>>так а constexpr тут вообще нужен?

V>Да, иначе его не определить в хедере, а если его не определить в хедере, то вызов по нему может оказаться непрямым.

Это как?
Re[5]: 'static constexpr auto' в качестве алиаса функции
От: Vamp Россия  
Дата: 05.09.18 14:53
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Здравствуйте, Vamp, Вы писали:



X>>>так а constexpr тут вообще нужен?

V>>Да, иначе его не определить в хедере, а если его не определить в хедере, то вызов по нему может оказаться непрямым.

SO_>Это как?

Это никак — я тут неправ. Можно заменить обычным const с тем же эффектом.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: 'static constexpr auto' в качестве алиаса функции
От: SomeOne_TT  
Дата: 05.09.18 15:06
Оценка:
Здравствуйте, Vamp, Вы писали:


SO_>>Это как?

V>Это никак — я тут неправ. Можно заменить обычным const с тем же эффектом.

Нет, интересно, что такое "прямой вызов" — как-то связано с линковкой?
Re[7]: 'static constexpr auto' в качестве алиаса функции
От: Vamp Россия  
Дата: 05.09.18 15:57
Оценка:
SO_>Нет, интересно, что такое "прямой вызов" — как-то связано с линковкой?
Я имел в виду, что если указатель на функцию объявлен в хедэре, а определен в .cpp файле, то вызов по такому указателю, как правило, будет в виде косвенного (indirect) call или jmp. Это не слишком хорошо для производительности.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.