gpt4 book ai didi

c++ - 类局部类型可以在定义之前在模板类中使用吗

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:15 25 4
gpt4 key购买 nike

我有这样一种情况,我有一个模板类,它实际上只公开一个公共(public)函数,并使用一个本地定义的结构用于内部状态,我不想弄乱我的 header 的公共(public)部分。例如:

template <class T>
class MyClass {
public:

struct InternalState {
// lots of noisy stuff I don't want to see in the public section
};

void userCallableFunction() {
InternalState state;
doPrivateStuff(state);
}

private:
doPrivateStuff(InternalState& state) {
// ok for the internals to go here
}
};

我想将 InternalState 的定义向下推到私有(private)部分,因为类的客户端不需要看到它。我想降低噪音,所以它看起来像这样:

template <class T>
class MyClass {
public:
// only the stuff the client needs to see here
void userCallableFunction() {
InternalState state;
doPrivateStuff(state);
}

private:
// fine for the private noise to be down here
struct InternalState {
};

...
};

问题是:这样做合法吗?即在 userCallableFunc() 中使用 InternalState after 声明?我知道您不能对非内联/模板函数执行此操作,但是哪些规则适用于内联/模板函数?

编辑:

我已经在 Visual Studio 2010、Clang 4.1 和 gcc 4.8.1 中尝试过这个(样本在 IdeOne 中,还有一个非模板但 inlined case )并且它为所有人成功构建。所以问题是,这样做是否安全且便携?请提供引用,而不仅仅是说“不,你不能这样做”。

最佳答案

作为一个非限定 ID(没有 ::)并且不是可以解释为函数的语法,ADL 可以应用,名称 InternalState在声明中

InternalState state;

使用正常的非限定查找(查找非限定名称)进行查找。

对于成员函数主体内的非限定名称,适用特殊规则,请参阅 [basic.lookup.unqual]/8

For the members of a class X, a name used in a member function body [...], shall be declared in one of the following ways:

  • before its use in the block in which it is used or in an enclosing block (6.3), or
  • shall be a member of class X or be a member of a base class of X (10.2), or

请注意,这对非限定查找强加了一个顺序:首先,搜索封闭 block ,然后,如果未找到任何内容,则搜索类成员。另请注意:由于此上下文中的 InternalState 不依赖于模板参数,因此不会搜索基类范围(如果有基类)。

重要的部分有点微妙,不幸的是:应成为类 X 的成员 暗示 应声明在成员函数体之前。例如,

struct X
{
int meow()
{
return m; // (A)
}

int m;
} // (B)
;

(A) 行中,在当前 block 中找不到名称 m(或任何封闭 block , block 是复合语句,而不仅仅是任何 {})。因此,它在X整个 成员集中查找。这只有在 X 完成后才有可能,即在 (B) 点。

这同样适用于引用嵌套类的名称——毕竟,名称查找需要找出名称所引用的实体的种类(例如函数、变量、类型)。此外,查找非详细名称 IIRC 不会区分这些类型。

不幸的是,这是我现在能找到的最好的:/我不高兴,因为它非常微妙,只能间接回答问题。

关于c++ - 类局部类型可以在定义之前在模板类中使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22021524/

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