Что является объяснением/исправлением для ошибки компилятора при сортировке типов корзины с использованием Decltype, лямC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Что является объяснением/исправлением для ошибки компилятора при сортировке типов корзины с использованием Decltype, лям

Сообщение Anonymous »

Мне нужно было сортировать типы в кортеже по выравниванию, и в результате я просто хочу получить новый тип кортежа. < /p>
написал некоторую реализацию. Но в одном случае (при использовании постоянного auto sort_tuple (auto tuple) ) GCC и Clang дают ошибку, а в другом случае (при использовании большинства функций в качестве лямбда) MSVC дает ошибку, но в другом месте для (казалось бы,) по -разному. Код (Godbolt): < /p>
#include
#include
#include
#include
#include

using Index = std::size_t;
using Alignment = std::size_t;

struct Key {
Index old;
Alignment a;
};

template struct Elem {};

template
struct Map : Elems... {
static constexpr auto size = sizeof...(Elems);
};

template
struct Tuple {
static constexpr auto size = sizeof...(Ts);
};
struct alignas(2) s_1 {};
struct alignas(2) s_2 {};
struct alignas(2) s_3 {};
struct alignas(2) s_4 {};
using T1 = Tuple;

#define CLANG_GCC_DONT_WORK
//#define MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE

#if defined(CLANG_GCC_DONT_WORK)

consteval auto sort_tuple(auto tuple)
{

#elif defined(MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE)

using Sorted = decltype([]() consteval {
auto tuple = T1{};

#endif

constexpr auto size = [](::Tuple&){
return sizeof...(Ts);
}(tuple);

constexpr auto unsorted = []<
typename ...Ts,
auto ...Is
>(::Tuple&, std::index_sequence&&){
return std::array{Key{Is, alignof(Ts)}...};
}(tuple, std::make_index_sequence{});

using Unsorted = decltype([](
::Tuple&, std::index_sequence&&
){
return ::Map<
Elem...
>{};
}(tuple, std::make_index_sequence{}));

constexpr auto sorted = [](auto unsorted){
std::sort(
unsorted.begin(), unsorted.end(),
[](const auto& lhs, const auto& rhs){
return lhs.a > rhs.a;
}
);
return unsorted;
}(unsorted);

// gcc and clang complaining here
// (when using CLANG_GCC_DONT_WORK macro),
// I'm using trick with template argument deduction,
// and those, it seems, can't deduce
//
// also "sorted" std::array passed as template parameter,
// but when passing it through capture
// all compilers give error at this place
using Sorted = decltype([](
std::index_sequence&&
){
return ::Tuple<
decltype([](
[[maybe_unused]] ::Elem&& deduced_by_compiler
){
return T{};
}.template operator()(Unsorted{}))...
>{};
}.template operator()(std::make_index_sequence{}));

return Sorted{};

#if defined(CLANG_GCC_DONT_WORK)

};
using Sorted = decltype(sort_tuple(T1{}));

#elif defined(MSVC_DOESNT_WORK_BUT_DIFFERENT_PLACE)

}());

#endif

int main() {}
< /code>
so: < /p>

Это ошибка компиляторов или все в соответствии со стандартом? Рабочая реализация такой сортировки в C ++ 20 и ниже, я был бы признателен, если вы связываете ее в комментариях или что -то в этом роде

Подробнее здесь: https://stackoverflow.com/questions/797 ... le-using-d
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»