草庐IT

equality-operator

全部标签

c++ - 如何将 lambda 的 operator() 声明为 noreturn?

如何将lambda的operator()声明为noreturn?Ideone接受以下代码:#includeintmain(){[]()[[noreturn]]{std::exit(1);}();return0;}Clang3.5拒绝它:error:'noreturn'attributecannotbeappliedtotypes你可以在godbolt中试试:http://goo.gl/vsuCsF哪个是对的?更新:相关的标准部分似乎是5.1.2.5、7.6.3、7.6.4但在阅读后我仍然不是100%清楚(i)什么是正确的行为,(ii)如何将lambda的operator()标记为nor

为什么重写equals方法,还必须要重写hashcode方法

原因:1.为了提高效率采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用。我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java

为什么重写equals方法,还必须要重写hashcode方法

原因:1.为了提高效率采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用。我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java

c++ - 使用 ? 返回可选值: operator

我经常需要对函数使用可选类型:std::optionalget(conststd::string&field){autoit=map.find(field);if(it!=map.end())returnit->second;return{};}有没有办法在一行中返回可选值?例如这个:std::optionalget(conststd::string&field){autoit=map.find(field);returnit!=map.end()?it->second:{};}导致错误error:expectedprimary-expressionbefore'{'tokenretu

c++ - 使用 ? 返回可选值: operator

我经常需要对函数使用可选类型:std::optionalget(conststd::string&field){autoit=map.find(field);if(it!=map.end())returnit->second;return{};}有没有办法在一行中返回可选值?例如这个:std::optionalget(conststd::string&field){autoit=map.find(field);returnit!=map.end()?it->second:{};}导致错误error:expectedprimary-expressionbefore'{'tokenretu

c++ - `pair::operator=(pair&&)` 错误与 `auto&` 推断 move 操作 - libstdc++ 回归?

鉴于这个程序:structVal{Val()=default;Val(Val&&)=default;auto&operator=(Val&&);};/*PLACEHOLDER*/auto&Val::operator=(Val&&){return*this;}替换/*PLACEHOLDER*/与...intmain(){std::vector>v;v.emplace(std::begin(v),0,Val{});}...编译成功:g++6.2.0g++6.3.0g++7.0.1(主干)clang++3.9.1clang++5.0.0(HEAD)onwandbox替换/*PLACEHOLD

c++ - `pair::operator=(pair&&)` 错误与 `auto&` 推断 move 操作 - libstdc++ 回归?

鉴于这个程序:structVal{Val()=default;Val(Val&&)=default;auto&operator=(Val&&);};/*PLACEHOLDER*/auto&Val::operator=(Val&&){return*this;}替换/*PLACEHOLDER*/与...intmain(){std::vector>v;v.emplace(std::begin(v),0,Val{});}...编译成功:g++6.2.0g++6.3.0g++7.0.1(主干)clang++3.9.1clang++5.0.0(HEAD)onwandbox替换/*PLACEHOLD

c++ - 为什么字符串支持 `operator=(char)` ?

我的一位同事今天在我们的代码中发现了一个非常微妙的错误,基本上是这样的:doubled=65;std::strings="Helloworld";//..somewherelater,accidentallyassigningtosinsteadofasimilarly//namednumericalvariable.s=d;//sisnow'A'我发现这个错误发生的原因是std::basic_string有一个赋值运算符_Myt&operator=(_Elem_Ch){//assign1*_Chreturn(assign(1,_Ch));}现在编译器并没有真正提示(很多,如果级别足够

c++ - 为什么字符串支持 `operator=(char)` ?

我的一位同事今天在我们的代码中发现了一个非常微妙的错误,基本上是这样的:doubled=65;std::strings="Helloworld";//..somewherelater,accidentallyassigningtosinsteadofasimilarly//namednumericalvariable.s=d;//sisnow'A'我发现这个错误发生的原因是std::basic_string有一个赋值运算符_Myt&operator=(_Elem_Ch){//assign1*_Chreturn(assign(1,_Ch));}现在编译器并没有真正提示(很多,如果级别足够

c++ - if-else 语句中的 "equal to"与 "not equal to"运算符

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭6年前。Improvethisquestion在C中编写if-else语句时,如果两者都可以产生相同的结果,是否有理由优先使用运算符“等于”而不是“不等于”?下面的代码提供了上下文。因此,如果参数计数等于2,则将从用户那里检索一个字符串。但是,如果获取任何其他参数值,则会出现错误消息。intmain(intargc,stringargv[]){stringmsg;if(argc==2){msg=GetString();}else{pr