我正在学习C++,并且在C++primer中找到了以下代码:intmain(){strings("somestring");for(decltype(s.size())index=0;index!=s.size()&&!isspace(s[index]);++index)s[index]=toupper(s[index]);cout我理解代码将字符串中的第一个单词大写,输出是SOMEstring我很好奇的是为什么你需要使用decltype(s.size())来声明索引的类型。如果我将其更改为intindex=0,代码仍然可以正常编译和运行。对我来说使用int似乎更容易。我想我在这里遗漏
我正在尝试确定各种C++成员函数的返回类型。我知道decltype和std::declval可用于执行此操作,但我在语法和查找有用示例方面遇到问题。TestCBClass下面显示了一个包含静态和普通成员函数的混合类的哑类示例-带有和不带参数和返回类型。根据所讨论的方法,我希望能够从各种方法中的每一个声明一个返回类型的vector。在我的应用程序中,这些方法是对std::async的回调我需要std::future的vector.我尝试了各种声明,例如decltype(std::declval(TestCBClass::testStaticMethod))(我不确定在方法名称之前是否需要
在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha
在C++11中,SFINAE很容易判断一个表达式是否有效。例如,想象一下检查某些内容是否可流式传输:templateautoprint_if_possible(std::ostream&os,constT&x)->decltype(osprint_if_possible如果os,将只参与过载决议是一个格式正确的表达式。liveexampleongodbolt.org我需要在C++03中做同样的事情,我发现sizeof可以提供帮助(因为我需要一个未评估的表达式上下文)。这是我想出的:templatestructsfinaer{};templatevoidprint_if_possible
我刚刚意识到尝试通过decltype获取函数的返回类型不涉及VS2012上的ADL(参数依赖查找)(使用cl.exeV17.00.60610.1测试)。下面的例子#include#includenamespaceA{intFunc(voidconst*){printf("A::Func(voidconst*)\n");return0;}templatevoidDo(Tconst&t){Func(&t);}templatevoidPrintType(Tconst&t){printf("Type:%s\n",typeid(decltype(Func(&t))).name());}}name
这段代码intclash;structFoo{decltype(clash)clash;};在clang上静默编译,但在gcc上编译失败并给出错误error:declarationof'intFoo::clash'[-fpermissive]error:changesmeaningof'clash'from'intclash'[-fpermissive]错误的产生似乎需要2个成分:阴影必须由类成员完成(如果它是函数的局部作用域则没问题)。decltype([shadowedname])必须在声明[shadowingname]之前的阴影范围内使用。我的问题有两个:gcc拒绝此代码是否合理
我有一个表示函数参数列表的可变参数模板,例如:voidmyFunc(int,int,std::string){}templateclassMyTemplateClass{};...MyTemplateClassmyConcrete;//forusewithmyFunclater有什么办法可以只从decltype(func)中提取参数类型,而不必手动编写它们,例如:MyTemplateClassmyConcrete;在这种情况下,即decltype会给我“void(int,int,string)”,但是有没有一种方法可以只提取“int,int,string”部分以用于可变参数模板?注意:
考虑以下代码:inta=1;constint&b=a;std::cout();它在clang3.5上编译,而GCC4.9给出以下错误:错误:“const”限定符不能应用于“constint&”根据标准,哪个是正确的?我的猜测是GCC符合标准,就像您不能执行int&constb=a;一样。 最佳答案 我相信代码是有效的并且两种类型是相同的。[dcl.ref]/1说:Cv-qualifiedreferencesareill-formedexceptwhenthecv-qualifiersareintroducedthroughtheus
以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试。templateconstexprautowrong=false;templateconstexprautofoo(constTt)->int{static_assert(wrong,"");return{};}usingF=decltype(foo(1));intmain(){}clang实例化函数体并偶然发现static_assert。gcc和MSVC只看函数声明,忽略函数体中的static_assert。如果删除constexpr,所有编译器都能正常编译代码。问题:如果声明了返回
无论谁说这个问题是问题“Isthereaspecificreasonwhyatrailing-return-typeisnotacomplete-classcontextofaclass?”的重复,都不知道他/她在说什么。尾随返回类型不是类的完整类上下文这一事实不解释了为什么这个问题中的代码无法编译,尽管它解释了答案中给出的代码被拒绝的原因对于另一个问题,特别是涉及成员函数qux和baz的代码部分,正如OP所解释的那样。为了阐明我认为下面的代码有效的论点,您必须考虑thesecondnote在[expr.prim.this]中说:在尾随返回类型中,为了类成员访问的目的,被定义的类不需要