草庐IT

class_list

全部标签

c++ - 为什么在 C++11 中为 std::initializer_list 重载 std::begin() 和 std::end()?

在C++11(引用N3337)中,std::begin()和std::end()被指定为(§24.7[iterator.range]/p2-3)templateautobegin(C&c)->decltype(c.begin());templateautobegin(constC&c)->decltype(c.begin());2Returns:c.begin().templateautoend(C&c)->decltype(c.end());templateautoend(constC&c)->decltype(c.end());3Returns:c.end().但是,std::in

c++ - C++ 中更简单的 "Preventing derived classes"

Bjarne假设有正当理由阻止从某个类派生,给出了一个解决方案here对于“我可以阻止人们从我的类(class)派生吗?”的答案不过,我想到了:classfinal{protected:final(){}//line3};classB:privatevirtualfinal{};classD:publicB{//line9};intmain(){Bb;Dd;//line14}尝试编译时,会得到:foo.cpp:Inconstructor‘D::D()’:foo.cpp:3:error:‘final::final()’isprotectedfoo.cpp:9:error:withinth

c++ - 为什么 std::min(std::initializer_list<T>) 按值获取参数?

阅读thisquestion的答案,我惊讶地发现std::min(std::initializer_list)按值获取其参数。如果您使用std::initializer_list以其名称所暗示的方式,即作为某个对象的初始值设定项,我知道我们不关心复制它的元素,因为它们无论如何都会被复制以初始化对象。然而,在这种情况下,我们很可能不需要任何拷贝,因此将参数视为std::initializer_list似乎更合理。如果可能的话。这种情况下的最佳做法是什么?你不应该调用initializer_list吗?std::min的版本如果您关心不要进行不必要的复制,或者是否有其他一些技巧可以避免复制

c++ - 保留 std::initializer_list 的拷贝是否安全?这是什么道理?

在我的环境中,std::initializer_list被实现为指向第一个元素和大小的指针。仍然在我的特定设置中,我能够观察到:底层数据在当前函数帧中分配(因为指向第一个元素的指针是这样说的)从函数按值返回initializer_list不会更改指针的值(得出数据未与initializer_list一起复制的结论)。这使得复制initializer_list变得不安全,如果拷贝的生命周期比原始对象长。C++标准的进一步发布是否会维持这种行为?同样重要的是,这种行为背后的基本原理是什么?(今天真的很痛,所以我会天真地说这违背了“最不惊讶”的原则) 最佳答案

c++ - std::initializer_list 类型推导

最近写了一个很简单的类。classC{public:voidAddString(std::initializer_list>x){//irrelevant}};intmain(){Cc;c.AddString({{"1",1},{"2",2},{"3",3}});....//otherunimportantstuffreturn0;}令我惊喜的是,它编译并正常工作。有人可以向我解释一下编译器是如何推断出嵌套的大括号初始值设定项是用于std::pair的吗?我正在使用MSVS2013。 最佳答案 c.AddString({{"1",1

c++ - 错误 : base class 'A1' has private copy constructor

在windows平台上使用Clang3.7见以下代码:classA1{public:A1(char*name){}virtual~A1(){}private:A1(constA1&){}};classB1:publicA1{public:B1():A1(""){}};我收到以下错误:MyFile(31):8:error:baseclass'A1'hasprivatecopyconstructorB1():A1(""){}^MyFile(25):2:note:declaredprivatehereA1(constA1&){}^公开A1复制构造函数,消除错误!这里发生了什么?注意:通过改变

c++ - "template argument deduction for class templates"是否应该为可变类模板推导出空参数包?

“类模板的模板参数推导”提案(P0091R2)包含以下示例:templatestructX{X(Ts...)};Xx1{1};//OKXXx11;//OKX(除了构造函数定义缺少主体这一事实之外),该示例似乎表明用零参数构造的可变参数类模板将被推导为一个空的参数包。很遗憾,最新版本的g++不同意:intmain(){Xx1{1};Xx11;}Infunction'intmain()':error:invaliduseoftemplate-name'X'withoutanargumentlistXx11;^note:classtemplateargumentdeductionrequir

c++ - 侵入式_ptr : Why isn't a common base class provided?

boost::intrusive_ptr需要intrusive_ptr_add_ref和intrusive_ptr_release被定义为。为什么不提供一个可以做到这一点的基类?这里有一个例子:http://lists.boost.org/Archives/boost/2004/06/66957.php,但海报说“我不一定认为这是个好主意”。为什么不呢?更新:我认为这个类可能被多重继承滥用这一事实是不够的。任何从具有自己的引用计数的多个基类派生的类都会有同样的问题。这些引用计数是否通过基类实现都没有区别。我认为多线程没有任何问题;boost::shared_ptr提供原子引用计数,这个

c++ - 如何在 C++ 中伪造 "visibility of class"(不是函数)?

有nofeaturethatcontrolvisibility/accessibilityofclassinC++.有什么办法可以造假吗?是否有任何C++的宏/模板/魔法可以模拟最接近的行为?情况是这样的Util.h(库)classUtil{//note:bydesign,thisUtilisusefulonlyforBandC//Otherclassesshouldnotevensee"Util"public:staticvoidcalculate();//implementationinUtil.cpp};B.h(图书馆)#include"Util.h"classB{/*...co

c++ - 为什么要为 std::forward_list 拼接整个列表或线性范围?

将范围从一个列表拼接到另一个列表可以在常数时间内完成,但代价是使size()的复杂度呈线性。C++11改变了std::list的情况,要求size()为常数时间。例如,这破坏了gcc的实现,参见[C++0x]std::list::sizecomplexity.除了splice()范围外,还有什么其他原因size()不能成为常量时间在早期,C++03符合std::listimplementations?为什么拼接整个列表或范围是线性的std::forward_list?参见splice_after(),案例(1)和(3)。另见standarddraftN3485中的23.3.4.6for