草庐IT

decltype

全部标签

c++ - declval<T>() 是否与 (*(T*)nullptr) 相同?

是declval()只是替换(*(T*)NULL)的旧技巧在decltype中获取T的实例而不需要担心T的构造函数?这里是一些示例代码:structA{};structB{Aa;};typedefdecltype((*(B*)nullptr).a)T1;typedefdecltype(declval().a)T2;cout::value打印1因为T1和T2是同一类型。如果declval不仅仅是一个替代品,有什么区别,它在哪里有用? 最佳答案 declval()的优点是,如果在评估的上下文中使用它(即odr-used),则程序格式错误

c++ - decltype 和 typeof 的区别?

关于decltype和typeof的两个问题:decltype和typeof操作符有区别吗?typeof在C++11中会过时吗? 最佳答案 c++中没有typeof运算符。虽然大多数编译器确实提供了这样的功能很长一段时间,但它一直是编译器特定的语言扩展。因此,比较两者的行为通常是没有意义的,因为typeof的行为(如果它甚至存在的话)非常依赖于平台。由于我们现在有了获取变量/表达式类型的标准方法,因此确实没有理由依赖不可移植的扩展,所以我想说它已经过时了。要考虑的另一件事是,如果typeof的行为与给定编译器的decltype不兼容

c++ - decltype 和 typeof 的区别?

关于decltype和typeof的两个问题:decltype和typeof操作符有区别吗?typeof在C++11中会过时吗? 最佳答案 c++中没有typeof运算符。虽然大多数编译器确实提供了这样的功能很长一段时间,但它一直是编译器特定的语言扩展。因此,比较两者的行为通常是没有意义的,因为typeof的行为(如果它甚至存在的话)非常依赖于平台。由于我们现在有了获取变量/表达式类型的标准方法,因此确实没有理由依赖不可移植的扩展,所以我想说它已经过时了。要考虑的另一件事是,如果typeof的行为与给定编译器的decltype不兼容

c++ - 在嵌套 Lambda 中使用 `decltype` 时出现 GCC 段错误

我创建了一个宏,可以方便地构建lambda函数,使用它我可以在我编写的库中迭代张量对象。但是,嵌套这些宏似乎会导致GCC发生内部段错误。在扩展编译器的预处理器输出并经过一些试验和错误后,我发现原因似乎是在类或结构的方法中声明的嵌套lambda函数的参数列表中使用了decltype.下面是一个使用标准库的最小示例。#include#includetemplatevoidfor_each(constIteratorfirst,constIteratorlast,Funcfunc){for(Iteratorit=first;it!=last;++it){func(*it);}}templat

c++ - decltype(*&fun) 很奇怪?

我有:#include#includevoidf(){printf("foo\n");}intmain(){printf("%d%d%d\n",std::is_same::value,std::is_function::value,std::is_function::value);(*&f)();return0;}产生001foo在g++4.6.1和4.7.0上。谁能给我解释一下? 最佳答案 重要的是要注意decltype有两个含义:它可以用来找到一个实体的声明类型(因此它的名字),或者它可以用来检查一个表达式。我在这里松散地使用实

c++ - `decltype` 并将 ADL 查找与非 ADL 查找混合

这个问题在这里已经有了答案:HowdoIwriteanADL-enabledtrailingreturntype,ornoexceptspecification?(4个答案)关闭9年前。测试用例让函数autofoo(Tf)的返回类型与从headercmath调用sin(f)时相同在f是内部数据类型的情况下:templateautofoo(Tf)->decltype(sin(f)){usingstd::sin;returnsin(f);}这个坏了。decltype中的sin(f)不会在std中查找,因此只有C变体找到sin(double),返回类型为double。下面的程序演示了:#in

c++ - 在模板参数列表中使用 decltype 来推断指向类成员的指针的类型

当我尝试像这样实例化一个模板时,GCC给我一个“模板参数2无效”错误(参见usingCheck行)。我很好奇我可以在模板参数列表外使用decltype获取指向成员的指针,但不能在模板参数列表内获取(参见变量p2的定义)。事实上,Clang确实编译了这段代码。这是GCC中的一个错误,还是这段代码实际上是无效的,而Clang只是太包容了?templatestructchecker_template{};structS{intn;};intmain(){Ss;constexprautop1=&S::n;constexprautop2=&decltype(s)::n;usingCheck=ch

c++ - 说明乘以 2 个常量整数时的 decltype 输出

intmain(){constinta=1;constintb=2;typedefdecltype(a*b)multiply_type;cout程序的返回值是multiply_type是int。我很惊讶。我希望类型推导产生constint,并且由于表达式产生pr值,结果类型将是constint。PS:使用auto时,返回值将是int,因为它删除了const限定符。知道为什么multiply_type是int而不是constintwithdecltype吗?编辑:添加了一个与cv-qualifier相关的附加示例。#include#includeusingnamespacestd;str

c++ - decltype(auto) 函数返回类型不推导 && 类型

如果一个函数返回decltype(auto),它返回一个int&&类型的局部变量,为什么返回类型是int&?如果我将变量转换为它自己的类型,那么返回类型就是我所期望的(int&&)#includenamespace{autoi=5;autoj=5;decltype(auto)foo1(){int&&ret=std::move(i);returnret;}decltype(auto)foo2(){int&&ret=std::move(j);returnstatic_cast(ret);}}intmain(){static_assert(std::is_same_v);static_ass

c++ - decltype(..., void()) 和 void_t 的区别

上次我找到了很多关于SFINAE的答案,这些答案建议使用void_t助手。但我似乎不明白它有什么特别之处:decltype(...,void()).考虑这个例子:templateusingvoid_t=void;templatestructhas_foo:std::false_type{};templatestructhas_foo:std::true_type{};templatestructhas_bar:std::false_type{};templatestructhas_bar>:std::true_type{};classMyClass1{public:intfoo(){r