草庐IT

conversion-operator

全部标签

c++ - 为什么包含 '\0' 和 '\t' 的字符串不能使用 operator == 与 "\0\t"进行比较?

strings;s+='\0';s+='\t';if(s=="\0\t")cout我听不到“雅虎”。这是否意味着如果我想检查这样的字符串,我必须这样编码?if(s[0]=='\0'&&s[1]=='\t')cout 最佳答案 您正在使用将std::string与constchar*进行比较的运算符。在该函数中,假定constchar*指向一个以null结尾(即'\0')的c字符串。由于'\t'出现在终止符之后,因此该函数不会将其视为字符串的一部分,实际上,甚至无法确定它是否存在.你可以这样做:if(s==std::string("\

c++ - 在同一个类中重载 operator< 和 operator>

在我的作业中,我要设计一个类Message;在其他属性中,它具有“优先级”属性(主要目标是实现优先级队列)。在容器中我必须检查一个对象是否大于另一个,我重载了运算符'>'。现在,我有一些关于它的一般性问题......问题一:如果我重载运算符'>',我是否应该为参数(constMessage&、constMessage&)重载运算符'我的观点是同时重载>和if(message1>message2){...}(下面的代码是为message1对象调用operator>,还是调用operator但是,如果我像这样使用运算符会怎样:if(message1?operator>被声明为友元函数:fr

c++ - 创建库以覆盖迭代器的 operator*() - 风险悬空指针

我正在尝试创建自己的boost::adaptors::transformed.这里是相关的boostcode.这是它的用法(从aSOanswerbyLogicStuff修改):-CfuncPointer(B&b){//"funcPointer"isfunctionconvertfrom"B"to"C"returninstance-of-C}MyArraytest;//结果将与以下内容相同:-for(autob:test){Cc=funcPointer(b);//...something...}我的尝试我创建了CollectAdapter旨在像boost::adaptor::transf

c++ - 为什么提议的 `std::shared_ptr::operator[]` 以 `std::ptrdiff_t` 作为参数

AccordingtotheN4562proposal,thenewlyproposedstd::shared_ptr::operator[]takesinstd::ptrdiff_t,whichisasignedtype.这与标准库中的每个索引运算符都不一致。甚至std::unique_ptr::operator[]也需要std::size_t。做出这个决定的理由是什么? 最佳答案 大概这应该是指针接口(interface)的统一吧。用作数组时,好的ol'C指针接受负索引:p[-2]与*(p-2)相同;并且ptrdiff_t因此自

c++ - 为什么 boost::filesystem::path 和 std::filesystem::path 缺少 operator+?

考虑以下关于路径分解的断言,其中每个局部变量,例如stem具有明显的初始化,例如autostem=path.stem()—assert(root_path==root_name/root_directory);assert(path==root_name/root_directory/relative_path);assert(path==root_path/relative_path);assert(path==parent_path/filename);assert(filename==stem+extension);这一切都有效,除了最后一行——因为fs::path没有定义ope

c++ - 为什么 sgi STL 源代码在 operator new 函数前面使用双冒号?

我正在阅读SGI标准模板库的源代码。我发现operatornew函数前面总是有一个双冒号。像这样:T*tmp=(T*)(::operatornew((size_t)(size*sizeof(T))));operatornew可以不加::字段直接调用,那为什么STLcoder会这样写呢?如果我们不使用它们前面的::,可能会遇到什么陷阱或情况。 最佳答案 您可以为类重载operatornew并在其前面加上"::"将调用全局"default"operatornew而不是可能的重载。例如:#includeclassFoo{public:Fo

c++ - 什么时候 std::string_view::operator== 真的是 constexpr?

根据cppreference,std::string_view::operator==是constexpr。对于当前的库实现,我很难找到这种情况。这是我尝试过的:#includeconstexprcharx0[]="alpha";constexprchary0[]="alpha";constexprautox=std::string_view(x0,5);constexprautoy=std::string_view(y0,5);constexprautoa=std::string_view("alpha",5);constexprautob=std::string_view("alp

c++ - EASTL与STL,std::vector<uint64_t>::operator[]怎么会有这么大的性能差异

根据http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.htmlvector::operator[]在EASTL中比“常用的STL商业版本”快2%到70%。除非商业版的STL使用范围检查,否则比较不公平,这么简单的操作怎么可能有这么大的速度差异?更新:似乎答案是EA工程师只是通过与使用范围检查的版本进行比较来作弊...... 最佳答案 文档指出他们使用VC++2005进行Windows测试,checkediterators是enabledbydefault(是的

c++ - std::addressof 是否否定 STL operator& 要求?

为了使类型与C++03标准库“很好地配合”,重载operator&()被认为是一个坏主意,因为地址需要正确使用类型和重载它会产生意想不到的问题;这里的经典示例是ATL::CComBSTR。随着std::addressof()在C++11及更高版本中的出现,这是否否定了对标准库中使用的类型的旧要求?是否在C++11的标准中明确说明(或从中删除)要求,即规范是否要求标准库使用std::addressof()? 最佳答案 容器的value_type只有几个要求。它们主要取决于容器,但对于一般情况,要求至少是MoveConstructibl

C++ 运算符重载 : no known conversion from object to reference?

当我尝试编译以下(g++4.6.3)classA{};A&operator*=(A&a,constA&b){returna;}Aoperator*(constA&a,constA&b){returnA(a)*=b;}intmain(int,char*[]){Aa,b;a=a*b;return0;}我得到了错误/tmp/test.cxx:Infunction‘Aoperator*(constA&,constA&)’:/tmp/test.cxx:14:20:error:nomatchfor‘operator*=’in‘(*&a)*=b’/tmp/test.cxx:14:20:note:ca