草庐IT

c++ - 带有 std::ostream 的 declval 表达式(用于 SFINAE)

我正在尝试创建一个类型特征类来确定特定类型T可以通过进行流式传输std::ostream的运算符.我使用的是简单的SFINAE技术。最终,我尝试评估替换失败的表达式是:decltype(std::declval()());我的期望是,给定一个实例t类型T和std::ostream实例os,如果表达式os格式不正确,则应发生替换失败。但无论类型如何T显然都不会出现替换失败。.即使我只是声明typedef使用上述decltype表达式,在SFINAE的上下文之外,它可以愉快地编译,即使T不能与std::ostream一起使用.例如:structFoo{};intmain(){//Thisc

c++ - 为什么 'declval' 指定为 'add_rvalue_reference<T>::type' 而不是 'T&&' ?

§20.2.4[declval]templatetypenameadd_rvalue_reference::typedeclval()noexcept;//asunevaluatedoperand为什么使用add_rvalue_reference在这里?来自§20.9.7.2[meta.trans.ref]在add_rvalue_reference:IfTnamesanobjectorfunctiontypethenthemembertypedeftypeshallnameT&&;otherwise,typeshallnameT.[Note:Thisrulereflectsthesem

c++ - 为什么 'declval' 指定为 'add_rvalue_reference<T>::type' 而不是 'T&&' ?

§20.2.4[declval]templatetypenameadd_rvalue_reference::typedeclval()noexcept;//asunevaluatedoperand为什么使用add_rvalue_reference在这里?来自§20.9.7.2[meta.trans.ref]在add_rvalue_reference:IfTnamesanobjectorfunctiontypethenthemembertypedeftypeshallnameT&&;otherwise,typeshallnameT.[Note:Thisrulereflectsthesem

c++ - 检查变量类型是否可迭代?

有什么方法可以检查任意变量类型是否可迭代?所以要检查它是否有索引元素,或者我实际上可以遍历它的子元素?(例如使用foreach吗?)是否可以为此创建一个通用模板?我在搜索时发现了其他编程语言的技术。然而仍然需要找出如何在C++中做到这一点。 最佳答案 你可以为此创建一个特征:namespacedetail{//ToallowADLwithcustombegin/endusingstd::begin;usingstd::end;templateautois_iterable_impl(int)->decltype(begin(std:

c++ - 检查变量类型是否可迭代?

有什么方法可以检查任意变量类型是否可迭代?所以要检查它是否有索引元素,或者我实际上可以遍历它的子元素?(例如使用foreach吗?)是否可以为此创建一个通用模板?我在搜索时发现了其他编程语言的技术。然而仍然需要找出如何在C++中做到这一点。 最佳答案 你可以为此创建一个特征:namespacedetail{//ToallowADLwithcustombegin/endusingstd::begin;usingstd::end;templateautois_iterable_impl(int)->decltype(begin(std:

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++ - 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++ - 如何获得一个const限定的declval?

考虑以下代码:#include#include#includestructBase{intf()const;doublef();};structDerived:publicBase{template().f())>//ModifythisTg()const;};intmain(){constDerivedx;std::cout如何修改decltype(std::declval().f())这样它就会返回int而不是double?我试过了decltype(std::declval().f()但它不编译。 最佳答案 GCC4.8.1喜欢

c++ - std::declval vs crtp,无法从不完整类型推断方法返回类型

我正在尝试做这样的事情(在c++11中):#includetemplatestructbase{usingtype=decltype(std::declval().foo());};structbar:base{intfoo(){return42;}};intmain(){bar::typex;}失败了prog.cc:Ininstantiationof'structbase':prog.cc:8:14:requiredfromhereprog.cc:5:46:error:invaliduseofincompletetype'structbar'usingtype=decltype(st

c++ - 为什么 `is_­destructible` 使用 `declval<U&>().~U()` 而不是 `declval<U>().~U()` 定义?

根据is_destructible的定义(http://eel.is/c++draft/meta.unary.prop#lib:is_destructible),is_­destructible_v是true什么时候:EitherTisareferencetype,orTisacompleteobjecttypeforwhichtheexpressiondeclval().~U()iswell-formedwhentreatedasanunevaluatedoperand,whereUisremove_­all_­extents_­t.为什么使用declval().~U()而不是dec