相同的类和实例名称
Identical class and instance names
本文关键字:实例 更新时间:2023-10-16
我最近遇到了一个问题,即我需要一些辅助功能才能返回不同类型的实例,类似于 std::make_pair
。我选择的语法是:
Event event(Trigger(...), []() { });
其中...
是一些简单的参数,该参数基于...
的类型创建了不同的触发类型(例如Time
,UserInput
等)。
此外,我想要一些可以直接使用的预定义触发器,例如:
Event event(Trigger::OnInit, []() { });
我发现定义一个名为Trigger
的类和实例允许我支持这两个语法:
static const struct Trigger {
static const OnceTrigger OnInit;
TimeTrigger operator()(Time const &) const;
UserTrigger operator()(UserInput const &) const;
} Trigger;
注意相同命名的类型和实例名称。
这在GCC和MSVC中都起作用,但是我想知道这是否按照标准有效。两个编译器都支持这一点是"运气"吗?还是定义了名称查找,以确保这可以在所有编译器上使用?
在函数调用语法Trigger(...)
中,该类是由实例Per 3.3.10隐藏的:
2-类名称(9.1)或枚举名称(7.2)可以通过在同一范围中声明的变量,数据成员,功能或枚举器的名称隐藏。如果类或枚举名称和变量,数据成员,功能或枚举者以相同名称的同一范围(以任何顺序)声明,则类或枚举名称在变量,数据成员,功能或枚举的情况下隐藏枚举名称可见。
在合格的名称查找语法Trigger::OnInit
中,该类可见每个3.4.3:
1 - [...]查找[]
::
之前的名称,仅考虑其专业是类型的名称空间,类型和模板。
的确,该标准有一个示例,该示例说明了合格的名称查找不受类型名称隐藏的约束:
class A {
public:
static int n;
};
int main() {
int A;
A::n = 42; // OK
A b; // ill-formed: A does not name a type
}
因此,根据标准,您的代码很好。(这是否是一个好风格是另一回事!)
能够命名结构(或C 中的类)类型与该结构的实例相同,而从C中引入了该结构,这是因为结构名称在一个单独的名称空间中(与变量名相比,不是C namespace
的意义。
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 从DLL中删除类的实例
- 在std::vector上存储带有模板的类实例
- 为什么创建友元类的实例会导致"undefined reference to"错误?