为什么class :: class :: class :: staticClassMember()编译(在C中)?

为什么class :: class :: class :: staticClassMember()编译(在C中)?,第1张

概述我一定错过了C规范中的一些东西,因为我无法解释为什么以下代码成功编译: class MyClass { static void fun(); };int main() { MyClass::MyClass::MyClass::fun(); } 有人能指出我的标准还是只是解释一下语义?我猜想只允许一个MyClass ::.两个MyClass :: MyClass ::应该导致错误.尝试使用MS V 我一定错过了C规范中的一些东西,因为我无法解释为什么以下代码成功编译:

class MyClass { static voID fun(); };int main() { MyClass::MyClass::MyClass::fun(); }

有人能指出我的标准还是只是解释一下语义?我猜想只允许一个MyClass ::.两个MyClass :: MyClass ::应该导致错误.尝试使用MS Visual C 2017和GNU C 6.2.0,我意识到允许任何MyClass ::.

这不仅是一个理论问题.我想使用SFINAE和条件编译存在子类.工作得很好,直到基类与子类同名:

template <class T> voID callWorkout() { T::SubClass::workout(); }struct X { struct SubClass { static voID workout(); }; };struct Y { /*empty*/ };struct SubClass { static voID workout(); };int main() {  callWorkout<X>();  // works fine - compiled  callWorkout<Y>();  // works "fine" - not compiled,no SubClass in Y  callWorkout<SubClass>();  // ooops? - still compiled,there is no 'SubClass' in SubClass}

我的问题有两个部分:

> MyClass :: MyClass ::的确切语义是什么?
>如何修复上面的例子而不是编译callWorkout< SubClass>()? (我试图添加sizeof(typename T :: SubClass),但令人惊讶的是它也为T = SubClass编译)

解决方法 这是 injected class name of MyClass.你可以通过简单地使用std :: is_same_v< T,typename T :: SubClass>来验证它不是T.在SFINAE有条件的.

template <class T>auto callWorkout() -> std::enable_if_t<!std::is_same_v<T,typename T::SubClass>>{ T::SubClass::workout(); }

如果您不需要SFINAE(因为您没有尝试控制重载决策),那么带有描述性自定义消息的static_assert也可以很好地完成.

总结

以上是内存溢出为你收集整理的为什么class :: class :: class :: staticClassMember()编译(在C中)?全部内容,希望文章能够帮你解决为什么class :: class :: class :: staticClassMember()编译(在C中)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212309.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存