gpt4 book ai didi

c++ - 相同的类和实例名称

转载 作者:太空狗 更新时间:2023-10-29 21:43:59 24 4
gpt4 key购买 nike

我最近遇到了一个问题,我需要一些辅助函数来返回不同类型的实例,类似于 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(...) 中,类根据 3.3.10 被实例隐藏:

2 - A class name (9.1) or enumeration name (7.2) can be hidden by the name of a variable, data member, function, or enumerator declared in the same scope. If a class or enumeration name and a variable, data member, function, or enumerator are declared in the same scope (in any order) with the same name, the class or enumeration name is hidden wherever the variable, data member, function, or enumerator name is visible.

在限定名称查找语法 Trigger::OnInit 中,类根据 3.4.3 是可见的:

1 - [...] lookup of the name preceding [the] :: considers only namespaces, types, and templates whose specializations are types.

事实上,该标准有一个示例演示了限定名称查找如何不受类型名称隐藏的影响:

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++ - 相同的类和实例名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21401944/

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