草庐IT

c++ - 对于模板类 Foo 方法的参数, "Foo&"和 "Foo<T>&"是否相同?

考虑类templatestructFoo{Foo(constFoo&other){}};对于构造函数参数类型,是constFoo&和constFoo&在这种情况下是否相同?我一直认为不是,认为后者可以称为Foof=Foo(),而前者不能。但现在我不确定是否是这样。 最佳答案 在一个类模板中,类模板参数对每个实例都有一个独特的含义。这意味着Foo有T==int,因此模板化的ctor是Foo::Foo(constFoo&other).虽然额外的模板参数是可能的:templatestructFoo{templateFoo(constFoo

c++ - 将 vector 分配给单个元素

考虑std::vector对于某些类型T.我收到一个指向这种类型的函数的指针,还有一个T的实例。;t说。我的函数如下所示:voidbar(std::vector*foo,constT&t){foo->clear();foo->push_back(t);}有没有办法在一条语句中编写函数体?*foo=t;由于不存在适当的赋值运算符而不起作用。我也在考虑使用foo->assign(&t,&t+1);但这看起来很调皮。我正在使用C++11。 最佳答案 当然,您可以重新分配:*foo={t}; 关

c++ - 为什么我不能使用 auto 声明变量?

当我尝试声明一个类变量时,我在VisualStudio2015中遇到编译错误,而该类使用PIMPL模式。Foo.h:#pragmaonceclassFoo{public:Foo(conststd::wstring&str,conststd::vector&items);~Foo();private:structImpl;std::unique_ptrpimpl;};Foo.cpp:#include"stdafx.h"#include"Foo.h"structFoo::Impl{public:Impl(conststd::wstring&str,conststd::vector&item

c++ - 静态成员和默认构造函数 C++

我在我的书中看到一个声明:Youdon'thavetoinitializeastaticmemberwhenyoudeclareit;C++willinvokethedefaultconstructorifyoudon't.这真的让我对它的含义感到困惑。他们只谈论对象成员吗?如果是这样,它会在什么时候调用默认构造函数?另外,如果没有默认构造函数,如何初始化静态成员对象? 最佳答案 让我们分解一下。假设某处有一些classFoo;。现在我们将其设为我们类的静态成员,classStar{staticFooz;//...};现在本质上声明

c++ - 覆盖虚拟成员函数时,为什么覆盖函数总是变为虚拟?

当我这样写的时候:classA{public:virtualvoidfoo()=0;}classB{public:voidfoo(){}}...B::foo()也变为虚拟的。这背后的原理是什么?我希望它的行为类似于Java中的final关键字。补充:我知道它是这样工作的,也知道vtable是如何工作的:)问题是,为什么C++标准委员会没有留下直接调用B::foo()并避免vtable查找的机会。 最佳答案 标准确实留下了直接调用B::foo并避免表查找的机会:#includeclassA{public:virtualvoidfoo(

c++ - 如何检查 C++ 复制省略

我在copyellision上看到这篇文章在C++中,我在boost库中看到了关于它的评论。这很吸引人,因为我更喜欢我的函数看起来像verylargereturntypeDoSomething(...)而不是voidDoSomething(...,verylargereturntype&retval)所以,我有两个问题Google几乎没有这方面的文档,这有多真实?如何检查此优化是否实际发生?我假设它涉及查看程序集,但可以说这不是我的强项。如果有人能给出一个非常基本的例子来说明成功的省略是什么样子,那将非常有用我不会仅仅为了美化事物而使用复制省略,但如果我能保证它有效,那么它听起来非常有

c++ - C++共享库中基类的 undefined symbol 错误

我使用g++-shared...将以下代码编译为共享库:classFoo{public:Foo(){}virtual~Foo()=0;virtualintBar()=0;};classTestFoo:publicFoo{public:intBar(){return0;}};extern"C"{Foo*foo;voidinit(){//Runtimeerror:undefinedsymbol:_ZN3FooD2Evfoo=newTestFoo();//causeserror}voidcleanup(){delete(foo);}voidbar(){foo->Bar();}}重点是将我的类

c++ - 清空 C++ 对象

我经常向我的C++对象添加一个Empty方法,以使用类似于以下的代码清除内部状态。classFoo{private:intn_;std::stringstr_;public:Foo():n_(1234),str_("Hello,world!"){}voidEmpty(){*this=Foo();}};这似乎比在构造函数中复制代码要好,但我想知道*this=Foo()是否是清除对象时的常用方法?这个等着咬我的屁股有什么问题吗?有没有其他更好的方法来实现这种事情? 最佳答案 我会让构造函数调用我的函数:classFoo{private:

c++ - 使用 unique_ptr 作为方法参数 - 优点和缺点

我注意到如果我有以下内容:#includeusingnamespacestd;classFoo{public:Foo();};classWobble{public:voidSetWibble(unique_ptrfoo){this->wibble=move(foo);}//Ilikereturningarefasitgivescontrolto//theuserofmyframeworkoverrecievinga&oracopyFoo&GetWibble(){return*wibble;}unique_ptrwibble;};int_tmain(intargc,_TCHAR*argv

c++ - 为什么非静态数据成员初始化程序会破坏统一初始化语法?

如果您所有的类/结构数据成员都缺少初始化器,您可以使用统一的初始化语法来构造对象。structfoo{inti;floatf;};...foobar{5,3.141f};但是如果一个或多个成员有初始化器,统一的初始化语法就失效了。structfoo{inti;floatf=0;};...foobar{5,3.141f};//Compilererror.我推测,添加一个数据成员初始值设定项会自动实现一个或多个默认构造函数,并抑制initialization_list构造函数的默认实现。这是预期的标准吗?为什么会这样? 最佳答案 是的,