gpt4 book ai didi

c++ - 为什么要编译 class::class::class::static Class Member()(在 C++ 中)?

转载 作者:太空狗 更新时间:2023-10-29 20:20:00 27 4
gpt4 key购买 nike

我一定是遗漏了 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 .你可以验证它不是 T通过简单地使用 std::is_same_v<T, typename T::SubClass>在 SFINAE 条件中。

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

如果您不需要 SFINAE(因为您不想控制重载解析),那么 static_assert使用描述性自定义消息也可以做得很好。

关于c++ - 为什么要编译 class::class::class::static Class Member()(在 C++ 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55332814/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com