sách gpt4 ăn đã đi

Tại sao class::class::class::static Class Member() nên được biên dịch (trong C++)?

In lại 作者:太空狗 更新时间:2023-10-29 20:20:00 28 4
mua khóa gpt4 giày 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  void callWorkout() { T::SubClass::workout(); }
struct X { struct SubClass { static void workout(); }; };
struct Y { /*empty*/ };
struct SubClass { static void workout(); };

int chính() {
callWorkout(); // works fine - compiled
callWorkout(); // works "fine" - not compiled, no SubClass in Y
callWorkout(); // ooops? - still compiled, there is no 'SubClass' in SubClass
}

我的问题分为两部分:

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

câu trả lời hay nhất

那是 injected class name of Lớp học của tôi .你可以验证它不是 T通过简单地使用 std::is_same_v在 SFINAE 条件中。

mẫu 
auto callWorkout() -> std::enable_if_t>
{ T::SubClass::workout(); }

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

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

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress