草庐IT

c++ - 如何从 const 方法生成非常量方法?

在努力实现const正确性的同时,我经常发现自己编写了这样的代码classBar;classFoo{public:constBar*bar()const{/*codethatgetsaBarsomewhere*/}Bar*bar(){returnconst_cast(static_cast(this)->bar());}};用于许多方法,例如bar()。编写这些手动调用常量方法的非常量方法是乏味的;此外,我觉得我在重复自己——这让我感觉很糟糕。我可以做些什么来减轻这个任务?(不允许使用宏和代码生成器。)编辑:除了litb的解决方案外,我也喜欢我自己的解决方案。:)

c++ - 在 C++ 中将临时变量作为非常量引用传递

我有以下一段代码,作为示例,dec_proxy尝试反转增量运算符对在复杂函数调用foo中执行的类型的影响-顺便说一句,我无法更改其接口(interface)。#includetemplateclassdec_proxy{public:dec_proxy(T&t):t_(t){}dec_proxy&operator++(){--t_;return*this;}private:T&t_;};templatevoidfoo(T&t,S&s,R&r){++t;++s;++r;}intmain(){inti=0;doublej=0;shortk=0;dec_proxydp1(i);dec_pro

c++ - 检测导致代码量巨大扩展的 C/C++ 预处理器滥用

我正在寻找一种方法来检测或缓解C++源代码,这些源代码在预处理时会扩展到巨大的大小,从而导致GCC耗尽内存。示例代码:#includeusingnamespacestd;intmain(){#defineA30cout编译这个程序应该生成一个巨大的、语法正确的if-else树(适用于较小的版本;比如说,最高A10);如果执行,它会在该树中打印2^30个“helloworld”字符串之一。但是,尝试在8GB机器上编译会导致无响应行为,并且(一段时间后)会显示以下错误:internalcompilererror:SegmentationfaultA0^是否可以使用GCC4.9.x限制上述情

c++ - 来自右值的非常量类型引用

考虑以下代码:classWidget{};templateT&&foo2(T&&t){returnstd::forward(t);}///Return1stelementtemplatetypenamestd::tuple_element::type>::type&&foo(T&&t){returnstd::forward::type>::type>(std::get(t));}Widgetw;autolist=std::make_tuple(w,Widget());intmain(){auto&l=foo(list);//ThisisNOTwork//auto&l2=foo2(std

c++ - 树的常量和非常量版本的访问者模式

关于树的访问者模式,我遇到了代码重复问题。目前的情况如下:我有一棵树,由两个不同的节点类组成,即叶子和非叶子。此外,我有两个访问者基类,除了一个访问常量树和另一个访问非常量树之外,它们看起来非常相似。具体访问者必须执行的实际操作与节点的具体类型无关。我举一个简短的例子:classVisitor;classConstVisitor;classNode{public:virtualvoidaccept(Visitor&)=0;virtualvoidaccept(ConstVisitor&)const=0;};classLeaf:publicNode{virtualvoidaccept(Vi

c++ - 获取两个互斥量的锁并避免死锁

以下代码包含潜在的死锁,但似乎是必要的:要将数据从一个容器安全地复制到另一个容器,必须锁定两个容器以防止在另一个线程中发生更改。voidfoo::copy(constfoo&rhs){pMutex->lock();rhs.pMutex->lock();//docopy}Foo有一个STL容器,“复制”本质上就是使用std::copy。如何在不引入死锁的情况下锁定两个互斥量? 最佳答案 对foo实例施加某种总顺序,并始终以递增或递减顺序获取它们的锁,例如,foo1->lock()然后是foo2->lock()。另一种方法是使用函数语义

c++ - C++ constexpr 函数实际上可以接受非常量表达式作为参数吗?

我定义了一个constexpr函数如下:constexprintfoo(inti){returni*2;}这就是主函数中的内容:intmain(){inti=2;cout该程序是在OSX10.8下使用命令clang++编译的。令我惊讶的是,编译器没有产生任何关于foo(i)不是常量表达式的错误消息,而且编译后的程序实际上运行良好。为什么? 最佳答案 C++中constexpr函数的定义是保证函数在调用时能够生成常量表达式,以便在计算中仅使用常量表达式。但是,如果未在constexpr中使用结果,则评估是在编译时发生还是在运行时发生(

c++ - gcc是否将非常量表达式函数的内置函数视为常量表达式

请查看更新以获得更好的问题示例。原始代码混合了一些问题,使图片变得困惑:这个问题WhycanIcallanon-constexprfunctioninsideaconstexprfunction?呈现如下代码#includeconstexprintf(){returnprintf("asideeffect!\n");}intmain(){chara[f()];printf("%zd\n",sizeofa);}我的回答是格式错误,但gcc4.8.2允许它(seeitlive)。但是,如果我们使用-fno-builtin标志gcc会产生一个错误(seeitlive):error:callt

c++ - 编译器内存屏障和互斥量

posix标准说互斥量之类的东西会强制执行内存同步。但是,编译器可能会重新排序内存访问。假设我们有lock(mutex);setdata(0);ready=1;unlock(mutex);它可能会被编译器重新排序更改为下面的代码,对吧?ready=1;lock(mutex);setdata(0);unlock(mutex);那么互斥体如何同步内存访问呢?更准确地说,编译器如何知道重新排序不应该发生在锁定/解锁之间?实际上对于单线程方面来说,就绪赋值重新排序是完全安全的,因为函数调用锁(互斥锁)中没有使用就绪。编辑:因此,如果函数调用是编译器无法理解的,我们可以将其视为像这样的编译器内存

c++ - 为什么 C++ 标准库不包含 std::min、std::max 的非常量版本?

我依稀记得我在某个地方看到过关于这个的讨论,但我现在找不到了;“non-constminmaxc++”和类似的变体没有给出相关结果。为什么C++标准库不包含以下std::min的非常量重载(对于std:max也是如此)?templateT&min(T&a,T&b);有时它可能很有用,例如如果我想增加较低的数字:std::min(x,y)+=1;这个过载会导致什么问题吗? 最佳答案 这是由HowardE.Hinnant在N2199:"Improvedmin/max"中提出的,根据thisdiscussion被拒绝了。在同一次讨论中,霍