gcc 6.1 std :: result_of ошибка компиляции

Рассмотрим небольшой автономный вариант использования, в котором я хочу определить, является ли тип полным или неполным использованием

#include <type_traits>
namespace {

struct foo {
template<class T, std::size_t = sizeof(T)>
std::false_type  operator()(T&);
std::true_type operator()(...);
};

struct FooIncomplete;
}int main() {
std::result_of<foo(FooIncomplete&)>::type();

return 0;
}

Это хорошо компилируется с gcc 4.9.3 с --std=c++11 флаг. Однако с gcc 6.1 а также --std=c++11 это производит ошибка компиляции как

main.cpp: In function 'int main()':
main.cpp:17:5: error: 'type' is not a member of 'std::result_of<{anonymous}::foo({anonymous}::FooIncomplete&)>'
std::result_of<foo(FooIncomplete&)>::type();

Что мне здесь не хватает? Что может быть возможным обойти?

3

Решение

Поскольку C ++ 14 result_of :: type не существует, если T не вызывается.

В вашем случае struct FooIncomplete нечего вызывать.

0

Другие решения

Используя что-то вроде C ++ 20-х годов is_detected:

namespace details {
template<template<class...>class Z, class, class...Ts>
struct can_apply:std::false_type{};
template<class...>struct voider{using type=void;};
template<class...Ts>using void_t = typename voider<Ts...>::type;

template<template<class...>class Z, class...Ts>
struct can_apply<Z, void_t<Z<Ts...>>, Ts...>:std::true_type{};
}
template<template<class...>class Z, class...Ts>
using can_apply=typename details::can_apply<Z,void,Ts...>::type;

template<class T>
using size_of = std::integral_constant<std::size_t, sizeof(T)>;

template<class T>
using is_complete = can_apply< size_of, T >;

мы получаем черту is_complete это правда, если мы можем применить sizeof в T,

Будьте осторожны с этим, потому что, в отличие от большинства функций, полнота типа может изменяться между блоками компиляции и даже в разных местах одного и того же блока. И C ++ не лайк это когда тип some_template<some_args...> изменения в разных местах вашей программы.

Живой пример.

0

По вопросам рекламы [email protected]