草庐IT

const_cast-ing

全部标签

c++ - 如何将 `void(*fn)(const char *, ...)` 转换为 `std::function`,反之亦然

typedefvoid(*fn1)(constchar*,...);typedefstd::functionfn2;//hasinitializerbutincompletetype直觉上,这些对我来说实际上是一样的,但显然我的直觉让我失望了。我将如何协调这些数据类型?fn2为什么是不完整的类型?需要对fn2的签名进行哪些更改,以允许我为其分配fn1类型?创建要分配给fn2的lambda时,如何访问可变参数列表?换句话说,等价于以下的lambda是什么?voidfn1_compatible(constchar*format,...){va_listargs;va_start(args,

c++ - 如何将 DRY 原则应用于 C++ 中的迭代器? (迭代器、const_iterator、reverse_iterator、const_reverse_iterator)

好的,现在我有两个(完全不相关的,不同的项目)类使用迭代器。一个有iterator和reverse_iterator按预期工作,另一个,当前的有iterator和一个半splinter的const_iterator(具体来说,因为const_iterator派生自iterator,代码LinkedList::iteratori=const_list.begin()是有效的并且允许您修改const定义的列表...)。我打算将所有四种类型添加到此类中......如果可以的话。我将如何继续最小化复制/粘贴代码并仅更改返回类型?创建一个基类,如base_iterator继承自?创建一个iter

c++ - 将 boost::lexical_cast 与 std::transform 一起使用

g++不喜欢:vectorx;x+=1,2,3,4,5;vectory(x.size());transform(x.begin(),x.end(),y.begin(),lexical_cast);错误信息是:error:nomatchingfunctionforcallto'transform(__gnu_cxx::__normal_iterator>>,__gnu_cxx::__normal_iterator>>,__gnu_cxx::__normal_iterator,std::allocator>*,std::vector,std::allocator>,std::allocat

c++ - const 引用的默认参数中使用的统一初始值设定项

这是合法的c++0x语法吗?classA{public:voidsome_function(conststd::set&options={});//notethatthisislegal,whichbindstheconstreferencetoatemporary:voidsome_function(conststd::set&options=std::set());}因为如果是这样,我刚刚在GCC4.6中发现了一个错误。我得到的错误是:error:expectedprimary-expressionbefore'{'token这是……合乎逻辑的……如果它是非法的。更新:正如@Ker

c++ - std::back_inserter 在旧的 GCC 上需要 const_reference。为什么?

我目前正在查看一些可以在较新版本的GCC上编译但不能在旧版本上编译的代码。在我的例子中,我使用std::back_inserter将一些数据从一个数据结构std::copy到自定义数据结构。但是,如果我忘记了此自定义数据结构中的typedefvalue_type&const_referencetypedef,它将无法在GCC4.4上编译。相同的代码在GCC4.5上编译和运行得很好。这两个编译器版本之间有什么区别,这使得代码可以在一个版本上编译但不能在另一个版本上编译。我猜想这与C++11的实现有关,后者在GCC4.4中不太完整。我猜可能是decltype或另一个新的C++11关键字。此

c++ - 指向 const 的指针可以指向非常量对象 - 语言设计或技术原因?

//Example1constdoublepie=3.14;//constobjectconstdouble*cptr=&pie;//pointer-to-consttoconstobjectdouble*ptr=&pie;//ERROR-non-pointer-to-consttoconstobject//Example2doublepie=3.14;//non-constobjectconstdouble*cptr=&pie;//non-pointer-to-consttonon-constobjectdouble*ptr=&pie;//non-pointer-to-constto

c++ - 将 lexical_cast 用于无符号类型时检查负值

我有一种情况,我正在获取命令行参数并使用boost::lexical_cast(my_param).我希望my_param的负值会导致lexical_cast抛出,但它会愉快地转换它们,-1变成18446744073709551615.这看起来很荒谬,因为unsignedlong的最大值是2^32-1,它看起来更像是unsignedlonglong。所以我正在寻找一种更智能的方法来将char*输入转换为unsignedlong,或者一种方法来验证我没有接受伪装成大unsignedlonglong的负值。 最佳答案 有一个错误报告反对

c++ - 声明 const 全局变量时是否需要静态?

我经常在标题中看到//globalnamespace,notinclassstaticconstintmy_global=1984;但最近我了解到const意味着内部链接,所以我想知道这是否不需要静态? 最佳答案 这取决于。在C++中,它是不必要的,但有些人(包括我自己)喜欢把它放在里面,理由是说出我们的意思。当然,如果要在C中也使用header,则这是必要的(但对于C中的许多用途,您需要#define)。 关于c++-声明const全局变量时是否需要静态?,我们在StackOverfl

c++ - const T& 与 T&&

我有以下功能:Tfoo();并且,在另一个函数中,我正在使用返回的T值,例如:constT&t=foo();或T&&t=foo();我想问:两者是否等价?在内存方面,这两种方法有什么区别?我知道在第一种方法中,临时值生命周期与引用生命周期匹配。使用右值引用时也会出现同样的情况吗?我是否应该考虑使用const右值引用(constT&&)?我使用的是第一种方法,这是我习惯使用的方法,并且效果很好。我仍然在思考右值引用和C++11产品。 最佳答案 不是,它们有不同的类型。实现定义,但不太可能有任何区别。生命周期延长对右值和左值引用的作用相

c++ - 在 C++ 中哪个内存区域是 const 对象?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我不是在问堆栈/堆/静态是什么意思或它们之间有什么不同。我在问const对象在哪个区域?C++代码:#includeusingnamespacestd;constinta=99;voidf(){constintb=100;printf("constinf():%d\n",b);}intmain(){constintc=101;printf("globalc