问题标签 [dependent-name]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
194 浏览

c++ - 嵌套类是类模板中的依赖类型?

考虑以下:

如果没有typename,编译会失败,因为 T2 被认为是从属名称,因此不是类型。在查看了 C++17 草案标准 (N4659) 之后,我相信我已经确定了原因:

§ 17.6.2.1 ¶ 5

一个名称是当前实例化的成员,如果它是
- 一个非限定名称,当查找时,它指的是作为当前实例化的类或其非依赖基类的至少一个成员。
...
如果名称是当前实例化的成员,并且在查找时引用了作为当前实例化的类的至少一个成员,则该名称是当前实例化的依赖成员。

T1 是当前实例化的从属成员。T2 不是当前实例化的成员(它是 T1 的成员),

§ 17.6.2.1 ¶ 9.3

一个类型是依赖的,如果它是
......
- 一个嵌套类或枚举,它是当前实例化的依赖成员,
......

T1 是一个嵌套类,因此是一个依赖类型。

§ 17.6 ¶ 3

qualified-id旨在引用不是当前实例化(17.6.2.1)成员的类型并且其nested-name-specifier引用依赖类型时,它应以关键字typename为前缀,形成一个类型名说明符。...

因此,typename需要。

我的理解正确吗?如果是这样,这背后的理由是什么?除了嵌套在 T1 中的 T2 之外,查找如何T1::T2找到任何东西?

0 投票
2 回答
52 浏览

c++ - 在不指定模板参数的情况下引用非依赖名称

考虑以下:

我想在NonDependent不指定任何模板参数的情况下引用,如Foo::NonDependent.

我知道我总是可以使用一个虚拟参数:

但这很丑陋,并且由于NonDependent关于 是不变的T,我想在不依赖虚拟对象的情况下引用它。可能吗?

谢谢

0 投票
1 回答
422 浏览

c++ - std::vector 的比较运算符找不到 T 的比较运算符

以下非常简单的代码不会编译

https://godbolt.org/g/zn6UgJ

不会在我拥有的任何编译器中编译。

虽然以下

https://godbolt.org/g/o4pc1b

编译得很好,这让我觉得std::vector<T>比较运算符在命名空间中查找T,为什么不考虑全局命名空间?

0 投票
1 回答
265 浏览

c++ - 为什么即使直到最后才定义实际类型,从属名称也可以被认为是完整的

考虑这个例子

请注意,struct X直到最后才定义。我曾经相信所有使用 odr 的名称在实例化时都必须是完整的。但是在这里,编译器如何在定义之前将其视为完整类型?

我已经检查了 cppreference 中依赖名称和函数模板实例化的绑定规则和查找规则,但它们都无法解释这里发生了什么。

0 投票
1 回答
47 浏览

c++ - 访问条件类成员的方法,仅在被调用时才编译

我编写了下面的类,它有一个条件成员_sworksOnlyForString访问该成员的方法std::string。如果worksOnlyForString没有调用方法,即使成员不是,代码也会编译std::string

有一个众所周知的 c++ 规则——模板函数只有在使用时才会被完全编译。但就我而言,条件成员触发了这种行为。

问题是 - 为什么代码编译。

0 投票
1 回答
70 浏览

c++ - 具有依赖类型的非静态数据成员的非限定名称是否依赖

依赖名称在 C++ 标准中没有明确定义,因此在确定什么是依赖名称方面还有很多不足之处,这让我想到了这个问题:具有依赖类型的非静态数据成员的非限定名称是否依赖?例如:

这里的名称t是从属名称吗?类型当然是依赖的,但不清楚名称是否是依赖的,因为它总是可以被解析为引用一个成员。

0 投票
1 回答
148 浏览

c++ - 依赖名称的参数依赖查找

cppreference.com 上的这个描述

模板中使用的依赖名称的查找被推迟到知道模板参数之前,此时 [...] ADL 检查具有外部链接的函数声明,这些链接可以从模板定义上下文模板实例化上下文中看到。

与此相反,以下代码片段可以使用三个编译器(MSVC、clang、gcc)正常编译:

Foo是一个依赖名称CallFoo:它依赖于模板参数T。但是,Foo尽管违反了上面引用的两个规则,但编译器还是找到了该函数。

  • Foo从 的定义或实例化中都看不到的声明CallFoo,因为它在两者之下。
  • Foo有内部联系。

三个编译器都不太可能有错误。我可能误会了什么。你能详细说明一下吗?

0 投票
3 回答
655 浏览

c++ - 为什么在以下情况下不需要对依赖类型使用 typename?

我一直在阅读关于删除类型的引用,here

它给出了以下示例:

特征中的typesstd::remove_reference是依赖类型。

可能的实施

但是为什么不使用typename std::remove_reference</*TYPE*/>::type呢?

0 投票
2 回答
804 浏览

c++ - 为什么这个模板函数的行为不像预期的那样?

我正在阅读有关模板函数的内容,但对这个问题感到困惑:

如果我不写,结果是一样的template void g<double>(double);

我认为g<double>应该在之后实例化f(double),因此对fin的调用g应该调用f(double)。令人惊讶的是,它仍然调用f(int). g<double>谁能帮我理解这一点?


阅读答案后,我弄清楚了我的困惑到底是什么。

这是一个更新的示例。除了我添加了一个专业化之外,它几乎没有变化g<double>

随着用户的专业化,g(1.0)行为符合我的预期。

编译器是否不应该在同一个地方自动执行相同的实例化g<double>(或者甚至在之后main(),如The C++ Programming Language , 4th edition 的第 26.3.3 节所述)?

0 投票
2 回答
768 浏览

c++ - C++ - 为什么这里需要“模板”关键字?

我有以下代码:

当同时使用 gcc 9.2 和 clang (9.0) 构建它时,由于template调用fun. 铿锵声显示:

我不明白为什么编译器认为fun是上下文中的依赖名称f,因为f它本身不是模板。如果我改为C普通类而不是模板,错误就会消失;但是,我不明白为什么首先应该出现错误,因为既不S也不f依赖TC.

奇怪的是,MSVC 19.22 编译得很好。


笔记

在投票结束之前,我必须在哪里以及为什么要放置“模板”和“类型名”关键字?请考虑这是一种特殊情况,即使S确实是一个依赖名称,f如果不是因为它们是当前实例化的成员,在上下文中它也不会依赖。