问题标签 [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.
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
找到任何东西?
c++ - 在不指定模板参数的情况下引用非依赖名称
考虑以下:
我想在NonDependent
不指定任何模板参数的情况下引用,如Foo::NonDependent
.
我知道我总是可以使用一个虚拟参数:
但这很丑陋,并且由于NonDependent
关于 是不变的T
,我想在不依赖虚拟对象的情况下引用它。可能吗?
谢谢
c++ - std::vector 的比较运算符找不到 T 的比较运算符
以下非常简单的代码不会编译
不会在我拥有的任何编译器中编译。
虽然以下
编译得很好,这让我觉得std::vector<T>
比较运算符在命名空间中查找T
,为什么不考虑全局命名空间?
c++ - 为什么即使直到最后才定义实际类型,从属名称也可以被认为是完整的
请注意,struct X
直到最后才定义。我曾经相信所有使用 odr 的名称在实例化时都必须是完整的。但是在这里,编译器如何在定义之前将其视为完整类型?
我已经检查了 cppreference 中依赖名称和函数模板实例化的绑定规则和查找规则,但它们都无法解释这里发生了什么。
c++ - 访问条件类成员的方法,仅在被调用时才编译
我编写了下面的类,它有一个条件成员_s
和worksOnlyForString
访问该成员的方法std::string
。如果worksOnlyForString
没有调用方法,即使成员不是,代码也会编译std::string
。
有一个众所周知的 c++ 规则——模板函数只有在使用时才会被完全编译。但就我而言,条件成员触发了这种行为。
问题是 - 为什么代码编译。
c++ - 具有依赖类型的非静态数据成员的非限定名称是否依赖
依赖名称在 C++ 标准中没有明确定义,因此在确定什么是依赖名称方面还有很多不足之处,这让我想到了这个问题:具有依赖类型的非静态数据成员的非限定名称是否依赖?例如:
这里的名称t
是从属名称吗?类型当然是依赖的,但不清楚名称是否是依赖的,因为它总是可以被解析为引用一个成员。
c++ - 依赖名称的参数依赖查找
模板中使用的依赖名称的查找被推迟到知道模板参数之前,此时 [...] ADL 检查具有外部链接的函数声明,这些链接可以从模板定义上下文或模板实例化上下文中看到。
与此相反,以下代码片段可以使用三个编译器(MSVC、clang、gcc)正常编译:
Foo
是一个依赖名称CallFoo
:它依赖于模板参数T
。但是,Foo
尽管违反了上面引用的两个规则,但编译器还是找到了该函数。
Foo
从 的定义或实例化中都看不到的声明CallFoo
,因为它在两者之下。Foo
有内部联系。
三个编译器都不太可能有错误。我可能误会了什么。你能详细说明一下吗?
c++ - 为什么在以下情况下不需要对依赖类型使用 typename?
我一直在阅读关于删除类型的引用,here。
它给出了以下示例:
特征中的type
sstd::remove_reference
是依赖类型。
可能的实施
但是为什么不使用typename std::remove_reference</*TYPE*/>::type
呢?
c++ - 为什么这个模板函数的行为不像预期的那样?
我正在阅读有关模板函数的内容,但对这个问题感到困惑:
如果我不写,结果是一样的template void g<double>(double);
。
我认为g<double>
应该在之后实例化f(double)
,因此对f
in的调用g
应该调用f(double)
。令人惊讶的是,它仍然调用f(int)
. g<double>
谁能帮我理解这一点?
阅读答案后,我弄清楚了我的困惑到底是什么。
这是一个更新的示例。除了我添加了一个专业化之外,它几乎没有变化g<double>
:
随着用户的专业化,g(1.0)
行为符合我的预期。
编译器是否不应该在同一个地方自动执行相同的实例化g<double>
(或者甚至在之后main()
,如The C++ Programming Language , 4th edition 的第 26.3.3 节所述)?
c++ - C++ - 为什么这里需要“模板”关键字?
我有以下代码:
当同时使用 gcc 9.2 和 clang (9.0) 构建它时,由于template
调用fun
. 铿锵声显示:
我不明白为什么编译器认为fun
是上下文中的依赖名称f
,因为f
它本身不是模板。如果我改为C
普通类而不是模板,错误就会消失;但是,我不明白为什么首先应该出现错误,因为既不S
也不f
依赖TC
.
奇怪的是,MSVC 19.22 编译得很好。
笔记
在投票结束之前,我必须在哪里以及为什么要放置“模板”和“类型名”关键字?请考虑这是一种特殊情况,即使S
确实是一个依赖名称,f
如果不是因为它们是当前实例化的成员,在上下文中它也不会依赖。