草庐IT

c++ - 为什么 std::max 由 const 返回?

我想找到最大值Foo并对其调用inc(),这是一个非常量方法。当然,在寻找最大值时,我不想创建任何拷贝或移动,即我不想要Foofoo=std::max(foo1,foo2)。我尝试编写自己的max,但g++坚持要我返回一个const&。#includeclassFoo{public:Foo(intx):x_(x){std::cout(constFoo&foo)const{returnx_>foo.x_;}voidinc(){++x_;}intx_;};/**Doesn'tcompile.MustreturnconstT&ormustacceptnon-constT&*templatei

c++ - 使用未命名命名空间的字段名称与字段类型相同

考虑这个代码示例:#includenamespace/*unnamednamespace*/{structFoo{inta;intb;};}structBoo{FooFoo;/*fieldnamesameasfieldtype*/intc;voidprint();};voidBoo::print(){std::coutClang可以毫无错误地编译它。Debianclang版本3.5.0-9(tags/RELEASE_350/final)(基于LLVM3.5.0)Microsoftcl.exe编译它没有错误。(我不记得版本了,我用的是VS2012)和GCC:gcc版本4.9.2(Debi

c++ - 为什么使用 extern struct {} foo,会触发无效的 fPIC required 错误消息?

我正在构建一个共享库,它具有如下所示的相应代码和编译规则://x.Cstruct{shortlen;chars[32700];}foo;//u.Cexternstruct{shortlen;chars[32700];}foo;voidblah(void){foo.s[0]=0;}$CXX-cx.C-fPIC$CXX-cu.C-fPIC$CXX-shared-ox.so.1-Wl,-soname,x.so.1x.ou.o此代码使用intel(v13-v16)编译器和clang编译器(v3.6)进行编译和链接,但使用g++(版本4.9.2)时出现链接错误:u.o:relocationR_X

c++ - 索引上的 static_assert 在编译时知道

有没有办法静态断言编译时已知的索引,否则在运行时断言?示例:templateclassFoo{T_data[Dim];public:constT&operator[](intidx)const{static_assert(idxfoo;foo[0];foo[1];foo[2];//compilererrorfor(inti=0;i1}return0;} 最佳答案 您可以简单地抛出异常或断言。它将在constexpr上下文中编译失败。这仅在可以在constexpr上下文中评估抛出条件时才有效。请注意,某些版本的gcc中有一个错误会阻止

c++ - std::hash 专门化我自己的类并在类中使用它

我定义了一个类Foo,并希望有一个采用std::unordered_set的公共(public)成员函数作为参数类型。能够使用std::unordered_set,我必须专攻std::hash在命名空间标准中。如果我不尝试使用std::unordered_set也没关系作为Foo中的参数类型成员函数。但是,一旦我想使用std::unordered_set作为Foo中的参数类型成员函数,我在定义特化时遇到问题std::hash.如果我在Foo之后做声明,Foo上有错误声明因为std::hash没有定义。一招std::hash之前的定义,它也不起作用,因为现在Foo未知。Foo的转发声明在

C++:如何提高经常被复制的自定义类的性能?

我正从Java转向C++,但我在理解C++类的工作原理和设计它们的最佳实践方面遇到了很多困难。具体来说,我想知道在以下情况下我是否应该使用指向我的类成员的指针。我有一个自定义类Foo,它表示特定回合的游戏状态,Foo有一个自定义类Bar的成员变量,它表示该游戏状态的逻辑子集。例如,Foo代表棋盘,Bar代表受到攻击的棋子及其逃跑Action(不是我的具体情况,而是我认为更普遍的类比)。我想通过复制Foo并相应地更新拷贝的状态来搜索一系列移动。当我完成搜索该移动序列时,我将丢弃该拷贝,并且仍然有代表当前游戏状态的原始Foo。在Foo.h中,我声明了我的Foo类,并为其声明了一个Bar类型

c++ - std::tr1::function 是否有合理的默认值?

我花了一些时间在谷歌上搜索,但没有真正找到任何东西。我希望能够做到这一点:std::tr1::functionfoo(SOME_DEFAULT_FUNCTION_THAT_DOES_NOTHING);////Somecodethatcouldpossiblyassignfoo//foo();否则我必须这样做:std::tr1::functionfoo;////Somecodethatcouldpossiblyassignfoo//if(foo){foo();}我意识到我可以创建一个什么都不做的函数,但我正在寻找一些标准的方法来不必处理检查函数是否被赋予空对象模式的值。

c++ - 在 C++ 中不使用 RVO 创建的对象和复制构造函数

我是C++新手。请考虑以下代码:classfoo{intf;public:foo(intf1=0):f(f1){coutRBV和NRBV的定义是否正确?注释?是否必须定义一个可访问的复制构造函数在RVO期间不调用?没有RVO,在代码块中foorbv(){fooobj(9);returnobj;}fooret=rbv();创建“ret”时以下步骤是否正确(1)使用来自obj的复制构造函数创建一个临时对象(比如obj_temp),堆栈对象'obj'被销毁,(2)ret是obj_temp构造的copy,obj_temp稍后销毁;这意味着涉及三个对象,'obj'、'obj_temp'和'ret

c++ - 使用单独的源代码和 header 编译类

编辑:问题的解决方案如下:http://www.jusuchyne.com/codingchyne/2011/03/codeblocks-failed-to-find-the-header-file/它不会编译,我有以下错误:foo.h目录下没有那个文件;foo尚未声明;num未在此范围内声明foo不是类或命名空间至少可以说,这很奇怪,因为我只是使用代码块“创建一个新类”,然后将其添加到该项目中。这是源代码:标题:#ifndefFOO_H#defineFOO_Hclassfoo{private:intnum;public:foo();voidset_num(intset);intget

c++ - 常规初始化中的意外转换

Clang3.2报错如下代码,不明白为什么会出问题。该错误仅发生在模板函数中,并且仅在使用大括号进行初始化时发生。其他两个初始化按预期工作。structfoo{foo(){}~foo()=default;//deletedfoo(constfoo&rhs)=delete;foo(foo&&rhs)noexcept=delete;autooperator=(constfoo&rhs)->foo&=delete;autooperator=(foo&&rhs)noexcept->foo&=delete;};templatevoidbar(){fooa;//OKfoob{};//ERROR}i