这个C++功能的名称是什么?

Mic*_*ray 82 c++

我正在写一些C++代码,错误地省略了函数的名称WSASocket.但是,我的编译器没有引发错误并将我SOCKET与整数值1而不是有效的套接字相关联.

有问题的代码应该是这样的:

this->listener = WSASocket(address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Run Code Online (Sandbox Code Playgroud)

但相反,它看起来像这样:

this->listener = (address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Run Code Online (Sandbox Code Playgroud)

来自其他语言,这看起来可能是某种匿名类型.该功能的名称是什么,如果它真的是一个功能?

它的目的是什么?

当你不知道从哪里开始时,很难搜索它.

R. *_*des 151

逗号运算符†评估左侧,丢弃其值,结果产生右侧.WSA_FLAG_OVERLAPPED是1,这是表达的结果; 所有其他值都被丢弃.没有创建套接字.


†除非超载.是的,它可以超载.不,你不应该超载它.现在就远离键盘!

  • 但你确实对强大的逗号有多可怕是最好的解释.无情和充满嘲笑,它惹恼我的代码几分钟,同时盯着我,并没有因为它的行为而感到羞耻. (39认同)
  • 20赞成?FFS,这只是一个怪异的逗号. (34认同)
  • +1,提升精神非常有效地重载了逗号运算符,但这是一个非常孤独的例外规则:*不要这样做*. (9认同)
  • 相关:[何时超载逗号运算符?](http://stackoverflow.com/q/5602112/1025391) (3认同)
  • @Bathsheba Boost.Assign也会重载逗号运算符,但是自C++ 11以来谁使用它? (2认同)

Bat*_*eba 22

逗号操作符是使你的代码感.

您正在有效地设置this->listener = WSA_FLAG_OVERLAPPED;恰好在语法上有效的.

  • @MSalters并不是说POSIX在这方面要好得多 (5认同)
  • 不仅在语法上有效,而且由于Windows API不是类型安全的,因此它也是有效的转换. (3认同)

Sea*_*ean 21

编译器在括号内依次评估每个序列点,结果是表达式WSA_FLAG_OVERLAPPED中的最终表达式.

逗号运算符,是C++中的序列点.在右边的表达式之前,将完全评估逗号左侧的表达式.结果始终是右边的值.当你有一个表达式(x1,x2,x3,...,xn)时,表达式的结果总是如此xn.