草庐IT

c++ - 当使用模板支持仿函数作为参数时,我应该使用什么限定符?

考虑这段代码:templatevoidfoo1(Ff){f();}templatevoidfoo2(Fconst&f){f();}templatevoidfoo3(F&&f){f();}我应该使用哪个版本的foo?foo1是我在“野外”看到最多的,但我担心它可能会引入我不想要的拷贝。我有一个自定义仿函数,复制起来有点麻烦,所以我想避免这种情况。目前我倾向于foo3(因为foo2不允许变异仿函数)但我不确定其含义。我的目标是C++11。 最佳答案 我实际上更喜欢foo3在foo1(虽然正文应该是std::forward(f)();)f

c++ - 将返回 Foo 的函数的结果分配给 const Foo&

我有一个返回Foo类型对象的函数:FoogetFoo();我知道下面的代码可以编译并且可以工作,但我为什么要这样做呢?constFoo&myFoo=getFoo();对我来说,下面的代码更具可读性,并且不会强制我记住C++允许我将右值分配给const引用:constFoomyFoo=getFoo();两者有什么区别?为什么我会使用第一个而不是第二个?为什么我会使用第二个而不是第一个? 最佳答案 与流行观点相反,不能保证将按值返回对象的函数的结果分配给const引用会导致比将其分配给对象本身更少的拷贝。当您将右值分配给const引用时

c++ - 重新定义为另一种符号

我正在我的xcodeios项目中创建一个简单的C++头文件,但出现错误“将‘foo’重新定义为另一种符号”。这是代码classfoo{public:char*getLabel(char*params);}; 最佳答案 好吧,错误消息是不言自明的,foo已经在同一个命名空间中定义,而您正在尝试重新定义它。“作为一种不同类型的符号”部分表明现有的foo是其他东西而不是类定义。更改名称很可能会解决您的问题。另一种方法是将foo的定义放入另一个命名空间。无论如何,我不建议您在真实项目中将某些东西命名为foo,无论它有多小;)

c++ - std::bind std::shared_ptr 参数不会增加 use_count

以下代码:#include#include#includestructFoo{Foo():m_p(std::make_shared()){}Foo(constFoo&foo){printf("copy\n");}std::shared_ptrm_p;};voidfunc(Foofoo){}intmain(){Foofoo;std::functionf=std::bind(func,foo);printf("usecount:%ld\n",foo.m_p.use_count());f();}得到结果:copycopyusecount:1copy由于复制了Foo,所以我认为m_p的use_

c++ - ctors 和 setter 参数的命名约定

对于那些没有像m_foo或foo_这样的特殊符号命名成员变量的人,您如何为您的ctors和setter命名参数?到目前为止我尝试过的一些选项...Obj(intfoo):foo(foo){}voidset_foo(intfoo){this->foo=foo;}Obj(int_foo):foo(_foo){}voidset_foo(int_foo){foo=_foo;}Obj(inta_foo):foo(a_foo){}//afor"argument"voidset_foo(inta_foo){foo=a_foo;}Obj(intinit_foo):foo(init_foo){}void

c++ - 虚函数

classa{virtualvoidfoo(void);};classb:publica{public:virtualvoidfoo(void){coutfoo();}请指导我为什么b_ptr->foo()不会调用类b的foo()函数? 最佳答案 在您编写代码时,由于访问控制违规,它无法编译。由于b_ptr实际上是a*类型并且a::foo是私有(private)的,编译器不允许这样做。但是将a::foo公开,这样就可以正确调用b::foo。还有一个问题是你没有定义a::foo所以你的程序不会链接。您需要定义它或使其成为纯虚拟的(即v

c++ - C++中的抽象类声明

假设foo是C++程序中的抽象类,为什么可以接受声明类型为foo*,但不是foo类型? 最佳答案 因为如果你声明一个foo你必须初始化/实例化它。如果你声明一个*foo,你可以用它来指向继承自foo但不是抽象的类的实例(因此可以被实例化) 关于c++-C++中的抽象类声明,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/5699187/

c++ - 如何从函数返回字符串文字

我总是对从函数返回字符串文字或字符串感到困惑。我被告知可能存在内存泄漏,因为您不知道内存何时会被删除?例如,在下面的代码中,如何实现foo()才能使代码的输出为“HelloWorld”?voidfoo()//youcanaddparametershere.{}intmain(){char*c;foo();printf("%s",c);return0;}还有,如果foo()的返回类型不是void,但是可以返回char*,应该是什么? 最佳答案 我假设我们不能修改main.为了使您的程序无泄漏地运行,您需要一些具有静态存储的东西:voi

c++ - 类模板的友元函数

我有一个类模板Foo.我想实现一个非成员函数Bar这需要两个Foos并返回Foo.我要Bar成为非成员(member),因为调用者写Bar(f1,f2)会更自然比f1.Bar(f2).我也想要Bar成为inline因为计算是微不足道且频繁的。templateinlineFooBar(constFoo&lhs,constFoo&rhs){...}诀窍是Bar需要访问Foo的私有(private)数据。我不希望访问私有(private)数据——没有充分的理由向用户公开私有(private)数据。所以我想制作BarFoo的friend.templateclassFoo{...private:

c++ - 为什么一个程序被拒绝为不明确的,可以通过重载决议来解决?

以下程序被gcc拒绝为有歧义:structAint{virtualvoidfoo(int);};structAstring{virtualvoidfoo(std::string);};structA:publicAint,publicAstring{};intmain(){std::strings;Aa;a.foo(s);return0;}>vt.cpp:Infunction‘intmain()’:vt.cpp:13:9:error:requestfor>member‘foo’isambiguous>a.foo(s);>^vt.cpp:5:34:note:candidatesare:v