草庐IT

const_cast-ing

全部标签

c++ - 当 static_cast'ing 为仅移动类型时,Clang 与 GCC

考虑以下简单的仅移动类:structbar{constexprbar()=default;bar(barconst&)=delete;bar(bar&&)=default;bar&operator=(barconst&)=delete;bar&operator=(bar&&)=default;};现在,让我们创建一个包装器:templatestructbox{constexprbox(T&&x):_payload{std::move(x)}{}constexprexplicitoperatorT()&&{returnstd::move(_payload);}private:T_payl

c++ - 区分 boost::bind 中具有相同名称的 const 和非常量方法

例如,当我将boost::bind与一个既声明为const又声明为非const的方法名称一起使用时,我遇到了不明确的错误,例如boost::bind(&boost::optional::get,_1)我该如何解决这个问题? 最佳答案 问题和解决方法在Boost.Bind的常见问题解答部分进行了描述引用。您还可以使用如下实用函数:#include#includetemplateRet(Obj::*const_getter(Ret(Obj::*p)()const))()const{returnp;}templateRet(Obj::*n

c++ - 如何声明和实现一个 const 和 inline 成员函数?

代码:点3f.hClassPoint3f{...inlinevoidproject2D(ProjTypep,constPoint2i&view)const;};点3f.cppinlinevoidPoint3f::project2D(ProjTypep,constPoint2i&view)const{switch(p){casePROJ_XY:glVertex2f(x*view.x,y*view.y);break;casePROJ_YZ:glVertex2f(y*view.x,z*view.y);break;casePROJ_XZ:glVertex2f(x*view.x,z*view.y

c++ - 如何使用 numeric_cast 策略?

所以我有自己的uint64_t到uint32_t数字转换策略structMyOverflowHandlerPolicy{voidoperator()(boost::numeric::range_check_result){std::cout如何让boost::numeric_cast使用它? 最佳答案 为了使用numeric_cast,numeric_cast_traits特化应该在每个类型转换上定义。这些特化已经为内置数字类型定义了默认值。可以通过定义BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_

c++ - const vs #define(奇怪的行为)

我曾经用#define替换const,但在下面的示例中它打印了false。#include#definex3e+38usingnamespacestd;intmain(){floatp=x;if(p==x)cout但是如果我替换#definex3e+38与constfloatx=3e+38;它完美运行,问题是为什么?(我知道有几个主题讨论#definevsconst,但真的没明白,请赐教) 最佳答案 在C++中,文字是double的。在第一个示例中,数字3e+38首先在变量初始化中转换为float,然后在比较中返回double。转换

c++ - const 成员函数中模板成员的常量

const如何应用于const成员函数中的模板成员?我发现以下内容很有趣(这是在VS15中):classTcpSocket;classTcpThread{TcpSocket*Listener()const;std::vectorsockets_;};TcpSocket*TcpThread::Listener()const{autos=sockets_.front();returns;}我添加了auto来阐明发生了什么。它被推导出为TcpSocket*,因此正在选择front的非const版本。但是,如果我插入sockets_.erase(sockets_.begin());作为第一行代

c++ - 为什么要返回基本类型的 const 引用? (std::string::operator[])

运算符std::string::operator[]的签名是:char&operator[](size_tpos);constchar&operator[](size_tpos)const;为什么const版本返回constchar&而不仅仅是char? 最佳答案 因为const对象的全部目的是它不能被修改。如果const类成员(在这种情况下)返回对字符串中字符的可变引用,您可以修改它。现在,就operator[]而言,这是因为您可以使用&运算符来获取指向它的指针。毕竟,这样的事情很常见:auto*foo=&bar[baz];您无法

c++ - C++ 中的函数重载(const 指针)

考虑以下代码片段:voidfoo(constinti)//Firstfoo{std::cout编译错误:'voidfoo(int)'的重新定义因为const可以用非const对象初始化,所以上面的行为似乎是合理的。现在考虑一下:voidfoo_ptr(constint*p)//Firstfoo_ptr{std::cout可能很清楚,我的问题是-如果第一种情况下foo的两个定义被认为是相同的,那么为什么foo_ptr不是这样第二种情况?或者换句话说,为什么const在第一种情况下被忽略而在第二种情况下却没有? 最佳答案 constin

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之外,该语言没有其他方法可以将函数指针类型转换为对象指针类型。这