草庐IT

qualified-name

全部标签

c++ - 私有(private)继承 : name lookup error

我有以下无法编译的代码示例:#includenamespacemy{classbase1{//line6};classbase2:privatebase1{};classderived:privatebase2{public://Thefollowingfunctionjustwantstoprintapointer,nothingelse!voidprint(base1*pointer){printf("%p\n",pointer);}};}gcc打印的错误是:test.cpp:6:error:`classmy::base1'isinaccessibletest.cpp:17:err

c++ - 为什么不允许仅对一个 ref-qualifier 进行重载?

显然,不允许在引用限定符上重载——如果您删除&或&&,此代码将无法编译(只需token,而不是它们的功能):#includestructS{voidf()&{std::cout换句话说,如果您有两个具有相同名称和类型的函数,则必须定义两者中的任何一个。我认为这是故意的,但原因是什么?为什么不允许,比如说,如果定义了右值,则调用&&版本,并在以下变体中的其他所有内容上调用“主要”f()(反之亦然–虽然这会令人困惑):structS{voidf(){std::cout换句话说,就主模板而言,让它们的行为类似于模板特化。 最佳答案 和下面

c++ - 错误 : passing 'const …' as 'this' argument of '…' discards qualifiers

error:passing'constA'as'this'argumentof'voidA::hi()'discardsqualifiers[-fpermissive]我不明白为什么会出现这个错误,我没有返回任何东西,只是传递了对象的引用,就是这样。#includeclassA{public:voidhi(){std::cout@edit我使用const正确性修复了它,但现在我试图在同一个方法中调用方法,我得到了同样的错误,但奇怪的是我没有传递对这个方法的引用。#includeclassA{public:voidsayhi()const{hello();world();}voidhel

c++ - 从 r-value ref-qualified 方法 move 还是不 move ?

在以下C++11+代码中,应该首选哪个return语句构造?#includestructBar{};structFoo{Barbar;Barget()&&{returnstd::move(bar);//1returnbar;//2}}; 最佳答案 好吧,既然它是一个r-valueref限定的成员函数,this大概就要过期了。因此,将bar移出是有意义的,假设Bar实际上从被move中获得了一些东西。由于bar是一个成员,而不是本地对象/函数参数,因此在return语句中复制省略的常用标准不适用。除非您明确地std::move它,否则

c++ - 是否可以在 C++ 中将函数(-name)作为模板参数?

我不想要函数指针开销,我只想要具有相同签名的两个不同函数的相同代码:voidf(intx);voidg(intx);...templatevoiddo_work(){intv=calculate();F(v);}...do_work();do_work();这可能吗?为了消除可能的混淆:“模板参数”是指模板的参数/参数和不是类型为模板的函数参数。 最佳答案 你的想法没问题,但你不是在传递一个类型,而是一个值(特别是一个函数指针>。或者,传递一个提供函数的模板策略-阅读AndreiAlexandrescu的ModernC++Desig

c++ - Clang 与 GCC : Friend-ing a global function via qualified/unqualified names

我正在尝试确定是否针对Clang、GCC或两者提交错误报告(我已经针对Clang主干和GCC4.7.2进行了测试:如果有人可以针对GCC主干验证这一点会有所帮助):基本上,在默认和C++11模式下,使用-fsyntax-only可以很好地编译以下代码三行文件:classA{friendvoidf();};请注意,没有事先声明f(),但这显然没问题。但是,Clang(但不是GCC)拒绝以下内容:classA{friendvoid::f();};来自Clang的错误是“在指定范围内找不到类型为'void()'的名为'f'的函数”,但我在标准中找不到任何理由来区别对待这种情况,所以我认为这是

c++ - 命名对象与临时对象 : Is it better to avoid named objects when possible?

以下是我从一个库的编码风格文档中找到的摘录:Wherepossible,itcanbebettertouseatemporaryratherthanstoringanamedobject,eg:DoSomething(XName("blah"));ratherthanXNamen("blah");DoSomething(n);asthismakesiteasierforthecompilertooptimisethecall,mayreducethestacksizeofthefunction,etc.Don'tforgettoconsiderthelifetimeofthetempo

c++ - 关于如何识别 Rvalue 或 Lvalue 引用和 if-it-has-a-name 规则

我正在阅读ThomasBecker的article关于右值引用及其使用。在那里,他定义了他所谓的if-it-has-a-name规则:Thingsthataredeclaredasrvaluereferencecanbelvaluesorrvalues.Thedistinguishingcriterionis:ifithasaname,thenitisanlvalue.Otherwise,itisanrvalue.这对我来说听起来很合理。它还清楚地标识了右值引用的右值性。我的问题是:你同意这个规则吗?如果没有,您能否举一个可能违反此规则的示例?如果没有违反这条规则。我们可以使用此规则来

c++ - 这个 "if e is a pack, then get a template name, otherwise get a variable name"是否有效?

我尝试构建一个不需要typename或template的案例,但仍会根据给定名称t生成变量或模板是否为函数参数包templatestructA{templatestaticvoidf(int){}};templatestructA{staticconstintf=0;};templateusingtype=int;templatevoidf(Tt){A...)>::f(1);}intmain(){f(1);}以上将引用staticconstint,并进行比较。以下刚好有Tt变成了一个包并制作f引用模板,但GCC也不喜欢templatevoidf(T...t){A...)>::f(1);

c++ - 为什么认为 'T *name' 是 C 方式而 'T* name' 是 C++ 方式?

注意:这个问题是关于星号(*)的位置。在我看到的大多数C代码中(例如,在Beej'sguidetonetworkprogramming中),所有变量声明/定义都使用T*name格式,即将*绑定(bind)到变量名。指针被认为属于变量,而不是类型。在我看到的大多数C++代码中,格式是T*name,即,它将*绑定(bind)到变量的类型。指针被认为属于类型,而不是变量。我自己,作为一个纯C++编码器,也使用这种格式,作为一个pointer-to-type显然(对我来说)属于类型,而不是变量。(顺便说一句,即使是C++标准在示例中也使用这种格式。:))这有(历史)原因吗?当程序员开始做C++