ошибка: `type` в` class std :: result_of` не называет тип - PullRequest
0 голосов
/ 08 ноября 2018

Пример ниже не работает со всеми компиляторами, которые я пробовал: gcc-8.2, clang-8.0 (были опробованы оба варианта --std=c++17 и std=c++2a) и zapcc-2017.08.

С моей точки зрения пример кода действителен и должен быть скомпилирован. Или, по крайней мере, должна быть более полная ошибка. Это похоже на ошибку в библиотеке std, не охватывающую этот конкретный случай для result_of. Я не прав?

#include <type_traits>
using namespace std;
struct bar {
    int a;
    long b;
};

template<auto M>
struct foo {
    static auto q(bar & b) {
        return b.*M;
    }
};

template<auto M>
auto qoo(bar & b) {
    return b.*M;
}


// error: 'type' in 'class std::result_of<int(bar&)>' does not name a type
using f = typename result_of<decltype(foo<&bar::a>::q)>::type;
// error: 'type' in 'class std::result_of<int(bar&)>' does not name a type
using q= typename result_of<decltype(qoo<&bar::a>)>::type;

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Попробуйте с

using f = typename std::result_of<decltype(&foo<&bar::a>::q)(bar&)>::type;

using q= typename std::result_of<decltype(&qoo<&bar::a>)(bar&)>::type;

Как лучше объяснено Т.С., type в std::result_of - это тип, возвращаемый из типа вызываемого при вызове с некоторыми типами аргументов.

Если вы напишите

std::result_of<decltype(foo<&bar::a>::q)>

вы передаете std::result_of только тип вызываемого (почти: вам также нужен & перед foo); Вы также должны передать тип аргументов (в данном случае только один аргумент: bar ссылка), поэтому

std::result_of<decltype(&foo<&bar::a>::q)(bar&)>
0 голосов
/ 08 ноября 2018

По моему опыту, на самом деле result_of не может ничего сделать, что decltype не может (или result_of_t, что помогло бы упростить ваш код): Как я могу использовать result_of Вместо decltype?

Это верно и в этом случае, где decltype и declval даст вам более простой результат, чем result_of:

using f = decltype(foo<&bar::a>::q(declval<bar&>()));
using q = decltype(qoo<&bar::a>(declval<bar&>()));

Живой пример

0 голосов
/ 08 ноября 2018

result_of_t<F(Args...)> означает «результат вызова / вызова F с Args...».

result_of_t<int(bar&)> означает «результат вызова int с bar&». Которого не существует, потому что вы не можете назвать int с чем угодно.

result_of - это , а не"извлекать тип возврата из типа функции".

...