草庐IT

const_cast-ed

全部标签

c++ - 如果在 C++14 或更高版本上,不是 const 的成员函数只能是 constexpr

在C++11中,成员函数上的constexpr意味着const。这在C++14中有所改变。我有一些代码有一个成员函数,它应该是constexpr,但不能是const,所以如果用stdc++14或更高版本编译,我希望它是constexpr。一种方法是:classFoo{#if_cplusplus>=201402Lconstexpr#endifintbaz(constBar&bar);};有没有更好的表达方式,最好不用预处理器? 最佳答案 最好的方法是利用功能测试宏,作为SD-6的一部分.constexpr成员函数不是隐式const的更

c++ - 如何在没有 reinterpret_cast 的情况下使用 dlsym() 加载函数?

我正在尝试使用clang-tidy来执行C++核心指南。虽然它确实有很多有效点,但有一件事我无法真正解决:dlsym返回一个void*,我需要以某种方式将其转换为适当的函数指针。为此,我使用了reinterpret_cast。由于准则禁止这样做,因此我对此提出了警告。当然,我可以在任何地方放置//NOLINT注释,但我正在寻找一种不使用reinterpret_cast的解决方案,这样警告就会消失。这个问题有什么解决方法吗? 最佳答案 除了reinterpret_cast之外,该语言没有其他方法可以将函数指针类型转换为对象指针类型。这

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