我知道通过实例对象调用静态方法是明确允许的.
但如果我想手动避免它,我怎么能在调用发生时收到警告?我的意思是,是否有一些编译器选项(或一些特殊属性)来检查情况?
我正在使用Clang,但也欢迎任何其他编译器特定功能.
答案是否定的.根据其他问答,该标准要求并允许此行为.见n3797 s9.4/2:
可以使用qualified-id表达式X :: s来引用类X的静态成员; 没有必要使用类成员访问语法(5.2.5)来引用静态成员.可以使用类成员访问语法来引用静态成员,在这种情况下,评估对象表达式.
鉴于这种直言不讳的语言,任何编译器如何做你所要求的?
也许你应该寻找一个版本的lint.我发现http://stellar.cleanscape.net/products/cpp/checks.html和错误1705可能是你想要的,我相信还有其他人.
所以问题是为什么lint,而不是编译器.这里有灰色阴影,但我认为编译器警告通常保留用于或可能或可能实际上是错误的事物.它们可能是未定义的行为,或实现定义,或者编译器执行的操作与预期不同的地方.通过指针调用静态方法不属于该类别.它绝对是标准的要求,并准确生成您期望的代码.
编译器不是用于执行编码标准,还有其他工具.在C/C++ Unix世界中,历史上lint使您能够检测并抱怨违反编码标准,而不是编译器.在.Net世界中,它一直是FxCop,尽管现在Visual Studio做了大部分相同的事情.如果你希望你的代码,以满足特定的标准,你找一个工具,做静态代码分析,比如这个名单在这里.
如果这不能回答你的问题,也许你可能想问另一个问题.就此而言,我确信编译器通过实现标准而不发出警告来做正确的事情.