草庐IT

限定词

全部标签

c++ - 如果存在非捕获局部变量,为什么不能在 Lambda 中使用非限定成员变量?

简单的例子:classFoo{intx;voidbar(intx){[this]()->void{x=6;}();}};这不会在GCC、Clang、MVC或ICC上编译(seeitlive)。如果我将voidbar(intx)更改为voidbar(inty),或者如果我将x=6;更改为this->x=6;然后就可以正常工作了。这对我来说没有意义。对bar的调用中的局部变量x故意不在lambda中捕获。唯一有意义的x是Foo的成员变量。问题:这是预期的行为吗,如果是,请解释原因? 最佳答案 来自cppreference:Forthep

c++ - 使用限定类型实例化的模板内函数的名称解析

考虑以下C++代码示例:namespacen{structA{};}structB{};voidfoo(int){}templatevoidquux(){foo(T());}voidfoo(n::A){}voidfoo(B){}intmain(){quux();//Error(butworksifyoucommentoutthefoo(int)declaration)quux();//Worksreturn0;}如评论中所示,模板实例化quux()导致编译器错误(在GCC4.6.3上):foo.cpp:Infunction‘voidquux()[withT=n::A]’:foo.cpp

c++ - 为什么当一个模板类继承另一个模板类时,需要重新指定typedefs和函数调用限定?

当一个模板类继承另一个模板类时,基类中的typedef必须重新定义(即不会自动继承),基类中的函数调用需要限定。这是为什么?这不是已经很明确了吗?因此,如果我有20个模板类,都定义了相同的typedef,我将无法引入包含这些定义的基类并从中继承,因为无论如何我都必须在每个类中重新定义typedef,这会破坏目的。这使得源代码变得不必要地冗长。我可以看到这已在question中讨论过,但我不明白评论TheC++namelookuprulesspecifythatanameisonlysearchedinatemplatedbaseclassesifitdependsonatemplate

c++ - 使用显式命名空间限定符时,模板实例化行为会发生变化吗?

我一直在试验一个可组合管道系统,它涉及一组“阶段”,这些阶段可能是模板化的。每个阶段处理自己的设置、执行和清理,模板推导用于构建管道使用的“状态”的最小列表。这需要相当多的样板模板代码,这些代码显示出一些明显不协调的行为。尽管实验成功,但实际上将其滚动到我们的代码库中会由于实例化无效而导致错误。我们花了一些时间来找出玩具(工作)解决方案和更丰富的版本之间的差异,但最终缩小到明确的命名空间规范。templatestructbind_stage{static_assert(!std::is_same::value,"Nope,someonedefaultinstantiatedme");}

c++ - 协变 cv 限定符是否适用于 C++ 中的原始类型?

在C++中,减少派生类中返回类型的cv限定符是有效的:classBase{virtualconstBase*f();};classDerived:publicBase{Base*f()override;};这对指向原始类型的指针有效吗?classBase{virtualconstint*f();};classDerived:publicBase{int*f()override;}; 最佳答案 协变cv限定符是否适用于C++中的基本类型?没有§10.3.7VirtualfunctionsThereturntypeofanoverrid

c++ - 为什么在推导类型时去除模板参数的限定符?

在使用MicrosoftVisualStudio2008构建一个小示例程序时,我注意到关于传递给模板的类型的推导有一件奇怪的事情。考虑这个例子:templatevoidf(Tv){x;//triggeracompileerror(void)v;}templatevoidg(Tv){f(v);}voidh(){inti;g(i);}使用cl/cfoo.cpp编译此示例会产生编译错误(如预期的那样)。有趣的是“T”模板参数的值。这是VisualStudio2008打印的内容:mini.cpp(3):errorC2065:'x':undeclaredidentifiermini.cpp(9)

c++ - 在不同限定的结构成员上使用 reinterpret_cast 是否安全?

我查看了以下相关的问题,但似乎没有一个能解决我的确切问题:one,two,three.我正在编写一个集合,其中的元素(键值对)与一些簿记信息一起存储:structElement{Keykey;Valuevalue;intflags;};std::vectorelements;(为简单起见,假设Key和Value都是标准布局类型。该集合无论如何都不会与任何其他类型一起使用。)为了支持基于迭代器的访问,我编写了覆盖operator->和operator*的迭代器,以向用户返回一个指针和一个引用,分别为键值对。但是,由于集合的性质,永远不允许用户更改返回的key。为此,我声明了一个KeyVa

c++ - 成员函数什么时候应该有 const 限定符,什么时候不应该?

大约六年前,一位名叫HarriPorten的软件工程师写道thisarticle,问这个问题,“成员函数什么时候应该有const限定符,什么时候不应该?”我发现这是我能找到的关于这个问题的最好的文章,我最近一直在努力解决这个问题,我认为在我发现的关于const正确性的大多数讨论中都没有很好地涵盖这个问题。由于当时还没有像SO这样强大的软件信息共享站点,所以我想在这里重新提出这个问题。 最佳答案 这篇文章似乎涵盖了很多基础知识,但作者仍然对返回指针的函数的const和non-const重载有疑问。文章的最后一行是:许多人可能会回答“视

c++ - 与 const 相反 - 换句话说,一个 writeonly 限定符?

我正在阅读Stroustrup的c++FAQ我注意到,有一次,他在语言中有一个writeonly限定符。经过一番讨论,我和一位同事只能想出一个目的——副作用,特别是在某些内存映射IO的情况下。writeonly限定符还有其他合法用法吗? 最佳答案 write-only限定符对于硬件寄存器很有用,因为从write-only寄存器读取会导致未定义的行为或细微的运行时错误。您可以使用#define,例如#definewrite-only,然后将其应用于寄存器,例如special_registerwrite_onlyUTXBUF;EETim

c++ - 用于复制 cv 引用限定符的类型特征

用C++编写类似库的代码我发现copy_cv_reference_t类型特征有特殊需求:structA;structB;static_assert(std::is_same,B>{});static_assert(std::is_same,Bconst>{});static_assert(std::is_same,volatileB>{});static_assert(std::is_same,volatileBconst>{});static_assert(std::is_same,B&>{});static_assert(std::is_same,Bconst&>{});stati