Как интерпретировать этот тип C ++?

Сегодня я помогал с неправильным фрагментом кода (func был объявлен сint парам, ноint* был передан в качестве второго параметраstd::thread конструктор):

#include <thread>

void func(int);
int* ptr;

void start()
{
    std::thread t = std::thread(func, ptr);
}

Когда я попытался скомпилировать это с gcc 5.3.0, он напечатал сообщение об ошибке следующего типа:

class std::result_of<void (*(int*))(int)>

Теперь мне интересно, как интерпретировать тип, передаваемый в качестве параметраclass std::result_of<>, Это похоже на указатель на функцию (в этом случаеvoid(*)(int)), но с дополнительным(int*) после звезды в скобках. Как интерпретировать этот тип?

 Daniel Frużyński15 июн. 2016 г., 22:42
Сообщение об ошибке сбивало с толку - самая важная часть была «ошибка: нет типа с именем« тип »в классе std :: result_of <void ((интермедиат)) (int)> ’". Таким образом, это полностью отличается от обычного «недопустимого преобразования из X в Y» или «нет соответствующей функции для вызова X ()».
 NathanOliver15 июн. 2016 г., 22:08
Еслиfunc требуетint почему вы передаетеint*?
 AnArrayOfFunctions15 июн. 2016 г., 22:32
Сначала я подумал, что компилятор отказался принять эту декларацию - верно ли мое предположение? Можете ли вы дать нам полное сообщение об ошибке, напечатанное gcc для ясности?
 sjrowlinson15 июн. 2016 г., 22:20
Аналогичное утверждение даетэто согласно cdecl.
 Daniel Frużyński15 июн. 2016 г., 22:10
Это была ошибка в коде, который я видел сегодня - возможно, это была опечатка.

Ответы на вопрос(2)

std::result_of злоупотребляет системой типов для контрабанды информации о вызове функции, чтобы она могла выяснить, какой будет тип возврата этого вызова функции.

Аргумент кstd::result_of имеет формуFty(T1, T2, ...), гдеFty вызываемый тип иT1 и т.д. - это типы аргументов, с которыми он вызывается. Учитывая эту информацию,std::result_of имеет вложенный тип с именемtype это синоним возвращаемого типа вызова вызываемого типа с подписьюFty с аргументами данных типов. Фу, это полный рот.

Итак, вresult_of<void (*(int*))(int)> У аргумента шаблона есть две части. Первая частьvoid (*(int*)), который является вызываемым типом в вопросе. В данном случае это указатель на функцию, которая принимаетint* и возвращаетсяvoid, Вторая часть(int), который является списком типов для предложенных аргументов.

Так что это говорит о том, чтоstd::result_of создается с помощью функции, тип которойvoid (*(int*)) и со списком аргументов(int), И это проблема, как вы указали: вы не можете передать аргумент типаint к функции, которая принимает аргумент типаint*.

Разве ты не рад, что спросил? (Кстати, это довольно низкоуровневая хакерская программа, которая больше не нужна;decltype гораздо более понятный способ выяснить тип возвращаемого значения вызова функции).

 Daniel Frużyński15 июн. 2016 г., 22:44
Да, это сбивало с толку в начале. Спасибо за объяснение.
Решение Вопроса
void (*(int*))(int)

функция, которая принимает один параметр типаint* как возвращается

указатель на функцию, которая принимает один параметр типаint и возвращается

void

Это похоже на стандартную библиотечную функцию C / C ++сигнал:

void (*signal(int sig, void (*func)(int)))(int);

который возвращает указатель на предыдущий обработчик сигнала (который имеет тот же тип, что иfunc параметр).

РЕДАКТИРОВАТЬ: КакПит Беккер указал в комментариипри использовании сstd::result_of, Этоозначает что-то другое, но сам тип выражения все еще тот тип, который я описал,std::result_of просто интерпретирует это по-другому.

 Pete Becker15 июн. 2016 г., 22:34
Да, это то, что было бы в реальном мире. Но этоне что это значит, когда это тип аргумента дляstd::result_of, который захватывает эту нотацию для представления вызываемого типа и его списка аргументов.
 Daniel Frużyński15 июн. 2016 г., 22:32
Спасибо, я вижу это сейчас. Я начал декодировать с неправильной точки и запутался.
 PcAF15 июн. 2016 г., 23:05
@PeteBecker Я думал, что OP был озадачен этим заявлением. Я никогда не слышал оstd::result_of (потому что я выучил C ++ после выхода C ++ 11, поэтому я использую толькоdecltype и новые функции), спасибо за ваше объяснение этого. Я отредактирую свой ответ.

Ваш ответ на вопрос