gpt4 book ai didi

c++ - std::is_same 无法通过 constexpr 自动变量的 decltype 工作

转载 作者:行者123 更新时间:2023-12-03 07:07:21 25 4
gpt4 key购买 nike

我试图static_assert某些元转换器算法有效,但令人难以置信的是,它与相同的算法没有比较,即使typeid().name()返回了完全相同的字符串。

在 typedef 中重复类型表达式可以修复 is_same,但是我无法理解在 typedef 中重复初始化表达式如何改变类型,而不是采用 decltype使用相同表达式初始化的自动变量

对我正在做的事情的更具体解释:
我做了一个元转换器,可以将元值列表(包含枚举器)转换为所有枚举器的 std::tuple。然后我检查生成的元组是否是我期望的元组。

下面的所有代码,请检查带有注释的行//有效//无效
最后的测试就在最后。

#include <type_traits>
#include <tuple>

template<typename T> struct ValueListAsTuple; // master template
// destructurer of list:
template<template <auto...> class L, auto... Vs>
struct ValueListAsTuple<L<Vs...>>
{
static constexpr auto value = std::make_tuple(Vs...);
//using type = decltype(std::make_tuple(Vs...)); // works
using type = decltype(value); // doesn't work
};

// template typedef
template<typename T> using ValueListAsTuple_t = typename ValueListAsTuple<T>::type;

struct Kind
{
enum EnumType { E1, E2 };
template <auto... Values> struct MetaVals{}; // meta value list
using MetaValueList = MetaVals<
E1,
E2
>;
};

int main(int argc, const char* argv[])
{
auto tuple = ValueListAsTuple_t< Kind::MetaValueList > {};

//std::cout << typeid(tuple).name() << '\n';
// this prints: "class std::tuple<enum Kind::EnumType, enum Kind::EnumType>"

// manual re-creation of the type, for testing:
std::tuple< Kind::EnumType, Kind::EnumType > t2;

//std::cout << typeid(t2).name() << '\n';
// this prints the exact same thing.

static_assert( std::is_same_v< std::tuple_element<0, decltype(tuple)>::type, Kind::EnumType > );
static_assert( std::is_same_v< std::tuple_element<1, decltype(tuple)>::type, Kind::EnumType > );

// WHAT ???
static_assert( std::is_same_v<
ValueListAsTuple_t< Kind::MetaValueList >,
std::tuple< Kind::EnumType, Kind::EnumType >
> );
// is_convertible_v works but I don't care ! wth ?
}

因此,如您所见,当通过 value 声明 type 时,is_same 无法推断出相同的类型,但如果我重复,它就会起作用std::make_tuple(..。我看不出这两种形式之间有什么区别。

我什至逐个元素地检查元组的每个索引处的类型是否相同。

检查 godbolt 中的操作:
https://godbolt.org/z/QUCXMB

gcc/clang/msvc 的行为是相同的

最佳答案

这确实是一个微不足道的错误,但不幸的是很难发现。您面临的问题是因为 constexpr意味着const 。所以在你的例子中typeconst tuple<...> ,它与您检查的非 cv 限定类型不同。对别名进行简短修复应该可以使您的测试通过:

using type = std::remove_const_t<decltype(value)>;

关于c++ - std::is_same 无法通过 constexpr 自动变量的 decltype 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55256699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com