Почему эта функция переводит 'const char *' в 'void * const', а не 'const void *'
Поскольку вы использовали void *
в качестве аргумента шаблона, и когда вы применяете const к нему, он становится void * const
. void *
является указателем (на неконстантный объект), а создание указателя const приводит к константному указателю, а не (неконстантному) указателю на константный объект.
Вы можете сделать что-то вроде этого, чтобы достичь того, что вы хотели:
return const_cast<T>(
static_cast<std::remove_pointer_t<T> const*>(ptr)
);
Однако вместо этого я рекомендую использовать пользовательский класс для переноса данных, которые вы отправляете в поток. Кроме того, не приводите тип функции. Используйте функцию с аргументом void*
и приведите аргумент внутри функции.
struct params_t {
const char *name;
};
static params_t params {"name"};
create_thread(thread_proc, ¶ms);
Никаких приведений не требуется (за исключением, очевидно, обратного вызова).