为什么 class::class::class::staticClassMember() 编译(在 C++ 年)
Why class::class::class::staticClassMember() compiles (in C++)?
我一定错过了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
编译(
这是注入的类名 MyClass
.您可以通过简单地在 SFINAE 条件中使用std::is_same_v<T, typename T::SubClass>
来验证它是否T
。
template <class T>
auto callWorkout() -> std::enable_if_t<!std::is_same_v<T, typename T::SubClass>>
{ T::SubClass::workout(); }
如果您不需要 SFINAE(因为您没有尝试控制重载解析(,那么带有描述性自定义消息的static_assert
也可以很好地完成。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何使用"derived input class"创建派生类?
- 错误:"Left of getValue must have class/struct/union"
- ' class a : b ' 和 ' class a : public b ' 之间的继承类不同
- Pybind11 Class Definition
- 在C++中使用没有合作伙伴Class/Cpp文件的头文件是否实用
- C2011 'CMemDC':Visual Studio 2019中的'class'类型重新定义
- TypeError: [c++ addon class] 不是构造函数
- C++ class template
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- Clearing Class Foo with new(pFoo) Foo()
- C++ class vs a library
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 使用"class"关键字,后跟未声明的标识符
- VSCode - C++对"CLASS::FUNCTION"的未定义引用