草庐IT

采用者

全部标签

c++ - 采用默认参数的构造函数中的语法错误 `std::map`

这个问题在这里已经有了答案:defaulttemplateclassargumentconfusesg++?(4个答案)关闭8年前。考虑简单的代码片段#include#includestructFoo{Foo(conststd::map&bar=std::map()):bar(bar){}std::mapbar;};intmain(intargc,char**argv){return0;}当我这样编译时:clang++-ofoofoo.cpp我遇到错误:foo.cpp:7:73:error:expected')'Foo(conststd::mapbar=std::map())^foo.

c++ - 将 R 值传递给采用 L 值的函数时的重载歧义

我有2个重载函数-一个采用L值,另一个采用R值。目的是使该函数可以像这样调用:Objobj;foo(obj);或者:foo(Obj());因此,我编写了2个重载函数:templatevoidfoo(T&v){/*...functionbodycodegoeshere...*/}templatevoidfoo(T&&v){foo(v);}intmain(){foo(int(5));}右值重载只需要委托(delegate)给左值重载。按照我的理解,一旦进入函数体,对v的任何使用都会给我一个左值引用,除非我专门使用std::move或std::forward。所以在R值重载中调用foo(v)

c++ - BOOST_FUSION_ADAPT_STRUCT 没有采用正确数量的参数

我正在使用Boost::Spirit将一些文本解析为结构。这需要使用BOOST_FUSION_ADAPT_STRUCT来解析文本并直接存储到结构中。我知道宏有两个参数:结构名称作为第一个参数,所有结构成员作为第二个参数。我只传递了那2个。但是我得到一个编译错误,error:macro"BOOST_FUSION_ADAPT_STRUCT_FILLER_0"passed3arguments,buttakesjust2这是代码片段。如果您需要完整代码,请告诉我。谢谢。namespaceclient{namespaceqi=boost::spirit::qi;namespaceascii=bo

c++ - 如何为采用 STL 容器迭代器的函数提供函数签名?

我想写一个可以这样调用的函数my_func,但不关心v是一个std::vector,它可以是任何STL容器。有点像std::for_each:std::vectorv={...};my_func(v.begin(),v.end());但我无法弄清楚函数签名。voidmy_func(???i1,???i2){std::for_each(i1,i2,...);//dumbexampleimplementation}我不擅长模板编程,所以即使查看std::for_each的函数声明也无济于事。是否有一个简单的实现,或者这是否会从根本上弄乱模板变量? 最佳答案

c++ - 我可以重载插入运算符以采用模板化 STL 容器吗?

这个问题在这里已经有了答案:C++printtemplatecontainererror(error:ambiguousoverloadfor'operator(4个答案)关闭3年前。我有这个关于STL容器的示例,所以我正在阅读它们,重复使用range-for对我来说太乏味了循环打印容器的内容。所以我想到重载插入运算符因此我可以写:std::cout.templatestd::ostream&operator&v){for(constauto&e:v)outvi{10,24,81,57,2019};vi.pop_back();std::coutnames{"Hello","STLCon

c++ - 专门化采用通用引用参数的函数模板

如何特化采用通用引用参数的函数模板?foo.hpp:templatevoidfoo(T&&t)//universalreferenceparameterfoo.cpptemplatevoidfoo(Class&&class){//dosomethingcomplicated}在这里,Class不再是推导类型,因此是Class确切地;它不可能是Class&,所以引用折叠规则在这里对我没有帮助。我也许可以创建另一个需要Class&的特化参数(我不确定),但这意味着复制foo中包含的所有代码对于所有参数的右值/左值引用的每种可能组合,这是通用引用应该避免的。有什么办法可以做到这一点吗?如果有

c++ - 为什么 `polymorphic_allocator` 采用 `memory_resource` 指针而不是引用?

C++17标准说:[mem.poly.allocator.ctor]polymorphic_allocator(memory_resource*r);Requires:risnon-null.Effects:Setsmemory_­rsrctor.Throws:Nothing.[ Note:Thisconstructorprovidesanimplicitconversionfrommemory_­resource*.— endnote ]接受memory_resource*有什么意义?而不是memory_resource&如果“需要”子句提到r必须是非空的?Bloomberg¹风格指

c++ - 按值将子类对象传递给采用父类(super class)对象的函数是否是明确定义的行为?

here等相关问题我都看过了和here关于这个话题,他们都描述了对象切片,但没有一个解决它是否安全、可靠和可预测。是否有来自标准或编译器的保证,如果我按值将子类对象传递给需要父类(superclass)的方法,则被切掉的部分恰好是子类,我将能够使用切片的父类(superclass)对象而不用担心未定义的行为? 最佳答案 是的,它是安全、可靠和可预测的,因为它由标准定义良好(它只会从派生类对象复制构造一个基类对象)。但不,它不安全,不应依赖它,并且通常被视为不可预测的,因为您的读者不知道发生了什么。当其他人稍后尝试修改您的代码(包括您

c++ - 按值传递类时,调用者或被调用者是否调用析构函数?

假设我有以下(精简)代码:classP{P();P(constP&);~P();}voidfoo(Px){...}voidbar(){Pp{};foo(p);//compilerusesP::(constP&)toconstructthevalueforx...//compilercallsP::~P()onp}编译器必须创建p的拷贝才能调用foo,因此caller在调用之前调用复制构造函数。我的问题是,谁负责销毁这个创建的对象?似乎有两个有效的选择:被调用者(即foo)在返回之前对其所有按值参数调用析构函数,然后调用者释放内存(通过将其从堆栈中弹出)。被调用者不执行任何操作,调用者(

c++ - 如何将字符串文字传递给采用 const std::wstring& 的函数

我有一个采用conststd::wstring&font_family的函数,即FontFont::CreateFont(conststd::wstring&font_family){...}问题是我如何通过传递字符串文字(例如等宽)来调用该函数?我试过了CreateFont("monospace");CreateFont("std::wstring("monospace"));两者都不编译。谁有更好的主意?谢谢。 最佳答案 尝试:CreateFont(L"monospace");前导“L”指示编译器生成宽(wchar_t)字符串。