- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图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
。所以在你的例子中type
是 const tuple<...>
,它与您检查的非 cv 限定类型不同。对别名进行简短修复应该可以使您的测试通过:
using type = std::remove_const_t<decltype(value)>;
关于c++ - std::is_same 无法通过 constexpr 自动变量的 decltype 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55256699/
由 this question 触发,我想知道是否允许这样做: template T foo(){return T{};} struct bar {}; int main() { bar a
我正在尝试以一种通用的方式实现 group_by 方法,我可能已经实现了它(除了它不适用于 C 数组),但代码对我来说仍然很难看...... 有没有更简单的方法来做我想做的事(+让它适用于所有容器和
这个问题在这里已经有了答案: What is decltype with two arguments? (2 个答案) 关闭 7 年前。 我遇到了一个decltype(),有两个参数作为模板函数的返
这是问题的后续:What does the void() in decltype(void()) mean exactly? . decltype(void()) 编译得很好,void() 在这种情况
这是我第一次使用decltype,我不太确定我是否正确使用它。该代码确实编译并且似乎适用于像 char 和 int 这样的 POD。 但是,我想知道我是否会遇到更复杂的数据类型的任何问题 - 其他人警
我一直在使用解析为与声明相同类型的定义中的推导返回类型。这有效: template struct Cls { static std::size_t f(); }; template declt
我发现它们是不同的,并且语言标准规定了每个语句应该检索什么样的类型(变量和表达式之间的差异)。但我真的很想知道为什么这两种类型应该不同? #include int x=0; decltype((x))
关于 decltype(x) 和 decltype((x)) 之间的区别,我已经读过很多遍了。一个例子如下。 x is the name of a variable, so decltype(x) i
我有一个简单的模板化包装器结构,其成员函数在其模板类型的对象上调用 .error()。 template struct Wrapper { T t; decltype(auto) f
decltype(auto) 和 decltype(returning expression) 作为函数(模板)的返回类型 if expr 有什么区别在这两种情况下都使用不带括号? auto f()
我在想 decltype((x)) 给出了 & 引用类型,但是一些实验表明还有其他事情: #include int main(){ int x = 0; decltype((x)) r
例如,简单的恒等仿函数: template class identity { public: constexpr auto operator ()(T && i) -> decltype(s
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: decltype and parenthesis 我在维基百科上找到了这个: auto c = 0;
// g++ 7.3 template struct td; int main() { int a = 1; td t1; td t2; return 0; } 编译结果如下: 错误:
这确实是一个 C++14 问题。而且它的理论性多于实践性。 有时您会零碎地构建一个函数的结果: int f( int x, int y ) { int a; //... re
我试图检测成员函数 baz() 的存在在模板参数中: template struct ImplementsBaz : public std::false_type { }; template stru
考虑以下代码:(Ideone) struct S { int a() {return 0;} decltype(a()) b() {return 1;} }; 它给了我以下错误: er
(如果您是 C++11 专业人士,请跳至粗体段落。) 假设我想编写一个模板方法,该方法调用并返回传递的对象的结果,该对象的类型是模板参数: template ReturnType doSomethin
代码 #include int main() { int a=3; int *p=&a; decltype (a) k1; decltype (*p) k2;
我是 C++ 新手。我正在尝试学习 decltype 的概念。我在网上看到这段代码。我将 decltype(s1.size()) 更改为 int,代码工作正常。 decltype(s1.size())
我是一名优秀的程序员,十分优秀!