草庐IT

c++ - 枚举值的行为是否像全局变量?

我有两个枚举,如果一个枚举中有一个值与另一个枚举中的值同名:enumA{joe,bob,doc};enumB{sunday,monday,doc};编译器(VisualStudio的)提示doc的重新定义,这意味着它将其视为全局变量。是这样吗?这不是我所期望的行为,它迫使我管理项目中所有枚举元素的名称。任何见解都会有所帮助。 最佳答案 它不被视为全局变量。它被视为全局标识符。更准确地说,它被视为声明enum的任何命名空间中的标识符。在您的情况下,这是全局命名空间。要了解全局标识符和全局变量之间的区别,请尝试获取枚举的地址。;)通常,

c++ - g++ 将返回的字符串文字视为 const char 指针而不是 const char 数组

当从应该使用g++(版本4.7.3)执行隐式转换的函数返回字符串文字时,我看到了一些奇怪的行为。任何人都可以解释为什么以下代码:#includeclassTest{public:templateTest(constchar(&foo)[N]){printf("Templateconstchararrayconstructor\n");}Test(char*foo){printf("char*constructor\n");}};Testfn(){return"foo";}intmain(){Testt("bar");Testu=fn();return0;}产生结果:Templateco

c++ - 将(某些)valgrind 警告视为错误?

是否可以将某些valgrind警告更改为错误?特别是,我想将probablylost警告变成错误。在valgrind手册中,我只找到有关如何抑制警告的信息。有没有办法做我想做的事? 最佳答案 从valgrind3.9版本开始,您可以使用以下命令行选项以便更好地控制哪些泄漏到报告中,哪些泄漏被视为错误。--show-leak-kinds=kind1,kind2,..whichleakkindstoshow?[definite,possible]--errors-for-leak-kinds=kind1,kind2,..whichlea

c++ - 为什么 "0f"在 C++ 中不被视为浮点文字?

为什么0f在C++中不被视为浮点文字?#includeusingnamespacestd;intmain(){cout编译上面的内容给了我C2509(syntaxerror:'badsuffixonnumber')使用VS2008。 最佳答案 如果这个设计决定有一个明确说明的原因,它会出现在C99“基本原理”文档中(C++从C中逐字复制了所有这些东西而没有重新考虑)。但是没有。这是关于“f”后缀的所有内容:§6.4.4.2FloatingconstantsConsistentwithexistingpractice,afloatin

c++ - 为什么具有相同名称但不同签名的多重继承函数不被视为重载函数?

以下代码片段在编译过程中产生了“对foo的模糊调用”错误,我想知道是否有任何方法可以在不完全限定对foo的调用的情况下解决此问题:#includestructBase1{voidfoo(int){}};structBase2{voidfoo(float){}};structDerived:publicBase1,publicBase2{};intmain(){Derivedd;d.foo(5);std::cin.get();return0;}所以,问题如题。想法?我的意思是,以下操作完美无缺:#includestructBase{voidfoo(int){}};structDerive

c++ - 如何有效地将 std::vector 视为 C 缓冲区?

对于Cbuffer,我经常这样做:BYTEbuffer[MAX_SIZE];intdataSize=0;while(appRunning()){dataSize+=Receive(buffer+dataSize,MAX_SIZE-dataSize);intprocessedSize=ProcessBuffer(buffer,dataSize);ASSERT(processedSize是否可以在不损失太多性能的情况下使用std::vector这样做?编辑:我找到了一种用std::vector替换原始C缓冲区的方法。std::vectorvbuf;vbuf.reserve(MAX_SIZE

c++ - 为什么 injected-class-name 有时不被视为类模板中的模板名称?

SourceInthefollowingcases,theinjected-class-nameistreatedasatemplate-nameoftheclasstemplateitself:itisfollowedbyitisusedasatemplateargumentthatcorrespondstoatemplatetemplateparameteritisthefinalidentifierintheelaboratedclassspecifierofafriendclasstemplatedeclaration.所以我尝试检查所有3种情况(另外在基本歧义的情况下,尽管我

c++ - 如何访问 valarray 的子序列,将其视为 C++ 中的二维矩阵

我正在学习C++,所以请耐心等待。我有一个std::valarray其中有double元素,我认为它是一个二维矩阵。classMatrix{valarrayelems;intr,c;public:/*type?operator[](intr){return?}*///...}我想重载operator[],这样我就可以得到矩阵的一行,然后,我想要m[r][c]接入运营商。有没有办法得到一行,作为double的序列使用std::slice在valarray,所以如果我改变一个值,它也会在矩阵中改变?我在valarray中读到了这个定义:std::slice_arrayoperator[](

c++ - 将 vector<int*> 视为 vector<const int*> 而无需复制 (C++0x)

一个类包含一个std::vector.外部代码需要对该vector进行只读访问,不应修改其内容(无论是指针还是它们的内容)。在类内部,值可能发生变化(例如double_values(),因此将它们存储为std::vector是不可能的。有没有办法返回std::vector作为std::vector没有复制?感觉应该有,因为const只是在编译期操作,说什么可以修改,什么不可以修改。代码:(用g++-std=c++0x编译)classReadOnlyAccess{public:ReadOnlyAccess(conststd::vector&int_ptrs_param):int_ptrs

c++ - 范围末尾的左值可以被视为右值吗?

编辑:考虑以下2个示例:std::stringx;{std::stringy="extremelylongtext...";...x=y;//***(1)}do_something_with(x);structY{Y();Y(constY&);Y(Y&&);...//many"heavy"members};structX{X(Yy):y_(std::move(y)){}Yy_;}Xfoo(){Yy;...returny;//***(2)}在这两个示例中,第(1)和(2)行的y都接近其生命周期的尽头,即将被销毁。很明显,它可以被视为右值并在两种情况下都可以移动。在(1)中,它的内容可以移