草庐IT

c++ - 在另一个成员函数的尾随返回类型中获取推导成员函数的 decltype 是否格式正确?

无论谁说这个问题是问题“Isthereaspecificreasonwhyatrailing-return-typeisnotacomplete-classcontextofaclass?”的重复,都不知道他/她在说什么。尾随返回类型不是类的完整类上下文这一事实不解释了为什么这个问题中的代码无法编译,尽管它解释了答案中给出的代码被拒绝的原因对于另一个问题,特别是涉及成员函数qux和baz的代码部分,正如OP所解释的那样。为了阐明我认为下面的代码有效的论点,您必须考虑thesecondnote在[expr.prim.this]中说:在尾随返回类型中,为了类成员访问的目的,被定义的类不需要

c++ - 使用 auto 重载模板函数的解析

使用以下3个重载templateautofoo(){return1;}templateintfoo(){return2;}templateTfoo(){return3;}以下是病态的吗?static_cast(&foo)();Clang选择重载#2,而gcc编译失败(Demo)当删除重载#1时,双方都同意选择重载#2(Demo)。删除重载#2时,gcc选择重载#1并且clang编译失败(Demo) 最佳答案 根据[over.over]/2,我们执行模板参数推导。这对于所有三个重载都会成功:在第一个重载中,保留[temp.deduct

c++ - C++14 中 decltype(auto) 的转换函数

classA{public:intnum;A(intparam):num(param){}operatordecltype(auto)(){returnnum;}};classB{public:intnum;AobjA;B(intparam):num(param),objA(param){}//operatorA(){returnobjA;}//Works//#1//operatorint(){returnobjA;}//Works//#2//operatorchar(){returnobjA;}//ActuallyNotNeeded//#3//operatordouble(){ret

c++ - 常量表达式中的静态成员访问

访问静态类成员函数或变量,可以通过两种方式完成:通过对象(obj.member_fun()或obj.member_var)或通过类(Class::member_fun()或Class::member_var)。但是,在constexpr函数中,Clang给出了对象访问错误,需要使用类访问:structS{constexprstaticautos_v=42;constexprstaticautov(){returns_v;}};#defineTEST1constexprautofoo(Sconst&s[[maybe_unused]]){#ifTESTconstexprautov=s.v(

c++ - 为什么使用 auto 的直接列表初始化被认为是不好的或不受欢迎的?

我已经养成了使用直接列表初始化编写代码的习惯,因为它更有效,而且对于防止隐式narrowing非常有用。:inti{0};strings{""};charc{'a'};boolb{false};autonum{100};//Butthis??但是当涉及到自动说明符时,我听说这样写被认为是不好的或不受欢迎的,这是为什么呢? 最佳答案 这是使用该语法失败的示例:structFoo{};voideatFoo(constFoo&f){}intmain(){Fooa;autob{a};eatFoo(b);}您可能希望这没问题:b应该是Foo并

c++ - 使用 std::iterator traits 和 auto 在函数声明中定义一个函数

今天我尝试实现基数排序。该函数必须有两个变量:开始迭代器和结束迭代器,并且可以有第三个:一些必须返回整数类型以进行排序的函数。默认情况下,它必须是恒等函数。我的尝试看起来像(抱歉,代码看起来又长又脏,但这只是一个尝试):templatevoidradix_sort(ForwardItfirst,ForwardItlast,std::function::value_type)>get_value=[](consttypenamestd::iterator_traits::value_type&x){returnx;}){//...}get_value的返回类型当然会在编译时知道。用法应该

c++ - 在 C++ 中使用 s 后缀的任何优势

这个问题在这里已经有了答案:Advantagesofusinguser-definedliteralforstringsinsteadofstringliteral(4个答案)关闭4年前。我的问题与C++中“s”后缀的使用有关?使用“s”后缀的代码示例:autohello="Hello!"s;//astd::string同样可以写成:autohello=std::string{"Hello!"};我在网上发现应该使用“s”后缀来最大程度地减少错误并阐明我们在代码中的意图。因此,“s”后缀的使用是否仅供代码阅读者使用?或者还有其他使用它的优势吗?

c++ - 为什么 auto_ptr 构造不能使用 = 语法

我遇到了一个对我来说意义不大的编译器错误:#includeusingnamespacestd;auto_ptrtable=db->query("select*fromt");错误:请求从“Table*”到非标量类型“std::auto_ptr”的转换但是,以下行确实有效:auto_ptrtable(db->query("select*fromt"));构造函数的这个定义阻止它按我预期的方式工作的原因是什么?我认为初始化声明使用了构造函数。这是我的auto_ptr的构造函数(来自SGISTL):explicitauto_ptr(element_type*__p=0)throw():_M_

现代C++中的decltype(auto):理解与运用

在C++14及以后的版本中,decltype(auto)成为了编译器和开发者的得力助手。它主要用于在编译时推断表达式的类型,并保证推断出的类型在上下文中是有效的。decltype(auto)比传统的decltype更强大,因为它能够处理更为复杂和动态的类型。decltype(auto)的工作原理decltype(auto)会根据初始表达式的类型进行推断,并在必要时对推断出的类型进行调整,以确保类型安全和一致性。例如,如果初始表达式是一个数组,decltype(auto)将推断出数组的元素类型;如果初始表达式是一个函数,decltype(auto)将推断出函数的返回类型。decltype(aut

c++ - g++ 6.1 可能的 std::forward 回归 - 错误或预期行为?

g++6.1最近被引入到ArchLinux的测试库中,我的一些使用g++5.3.0成功编译的代码不再编译。我做了一个最小的例子:gcc.godbolt.orglink//Thiscodecompileswithg++5.3.0//Thisdoesnotcompilewithg++6.1#include#include#include#defineFWD(...)::std::forward(__VA_ARGS__)structsinker{templatevoidsink(T&){}};templatevoidcaller(T&v,TF&&f){sinkers;f(s,v);}temp