当postfix丢失时,编译器选择前缀++ - 谁说?

Arb*_*est 11 c++ visual-c++

当您为用户定义的类型定义前缀operator ++并且您没有提供后缀版本时,编译器(至少在Visual C++中)将在您的代码调用缺少的POSTFIX版本时使用PREFIX版本.

至少它会给你一个警告.但是,我的问题是:为什么它只是给你一个未定义的成员函数的错误?

我亲眼看过这个,并且在另一篇文章和其他地方看过它,但我在实际的C++标准中找不到这个.我的第二个和第三个问题是......它是否符合标准?这是微软特有的处理情况吗?

Alo*_*ave 8

实际上,在这种情况下,MSVC的行为比GCC更智能.
这是一个MSVC编译器扩展,C++标准明确允许这样的行为.

C++标准:
第1.4/8节:
符合要求的实现可能具有扩展(包括其他库函数),前提是它们不会改变任何格式良好的程序的行为.需要实现来诊断使用根据本国际标准格式不正确的扩展的程序.但是,这样做之后,他们就可以编译和执行这样的程序.

在这种情况下,MSVC会适当地诊断后缀不可用的问题,并且它明确定义了警告,
编译器警告(级别1)C4620
编译器警告(级别1)C4621

此外,它为您提供了使用/ Za禁用MSVC特定扩展的功能.总的来说,我认为这是MSVC实际上比GCC更好的情况之一.