- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是什么决定了两个函数模板声明是声明了同一个模板,还是同名的重载?
答案开头在3.5p9:
Two names that are the same (Clause 3) and that are declared in different scopes shall denote the same variable, function, type, enumerator, template or namespace if
both names have external linkage or else both names have internal linkage and are declared in the same translation unit; and
both names refer to members of the same namespace or to members, not by inheritance, of the same class; and
when both names denote functions, the parameter-type-lists of the functions (8.3.5) are identical; and
when both names denote function templates, the signatures (14.5.6.1) are the same.
非模板非成员函数的签名是(1.3.17):
signature
<function> name, parameter type list (8.3.5), and enclosing namespace (if any)
[Note: Signatures are used as a basis for name mangling and linking. -- end note]
提到两次的parameter-type-list 已经在第 8.3.5p5 节中定义。该段描述了函数参数的实际类型如何根据声明的类型进行调整,用指针替换数组和函数,并丢弃顶级 cv-qualifiers。然后,
The resulting list of transformed parameter types and the presence or absence of the ellipsis or a function parameter pack is the function's parameter-type-list.
因此,在非模板情况下,parameter-type-list 显然是类型的概念语义列表(可能加上花哨的结尾),而不是标记序列或句法结构。正如我们所料,以下内容违反了 ODR,因为这两个定义定义了相同的函数:
void f(int, int*) {}
void f(int p, decltype(p)*) {}
在模板情况下,我们有 (1.3.18):
signature
<function template> name, parameter type list (8.3.5), enclosing namespace (if any), return type, and template parameter list
现在考虑:
template<typename T> void g(int, int*, T, T*) {} // #1
// template<typename T> void g(int p, decltype(p)*, T, T*) {} // #2
template<typename T> void g(int, int*, T q, decltype(q)*) {} // #3
g++ -std=c++0x 版本 4.6.3 提示定义 #1 和 #2 定义了相同的函数,但接受 #1 和 #3 作为重载没有问题。 (它还认为 #3 比 #1 更专业,没有办法调用 #1,但这是一个切线问题。)#2 和 #3 之间的主要区别是 q
是类型-dependent 而 p
不是。所以我猜 decltype(q)
的含义在模板实例化之前无法确定?标准保证这种行为吗?
对于函数模板,必须允许parameter-type-list 的含义包括尚未被实例化替换的模板参数,以及相关名称和所有其他内容。但这使得了解两个声明是否等同变得棘手(如果可能的话)。
14.5.6.1 的第 5-6 段解决了类似的问题,它定义了等价表达式和等价函数模板声明(相同的标记序列,除了不同的声明可能对模板参数使用不同的标识符),功能等效表达式和功能等效函数模板声明(实例化后相同),要求:
If a program contains declarations of function templates that are functionally equivalent but not equivalent, the program is ill-formed; no diagnostic is required.
第 5 段中的示例演示了安全等效的函数模板:
template <int I, int J> void f(A<I+J>); // #1
template <int K, int L> void f(A<K+L>); // same as #1
第 7 段中的一个示例表明违反了该规则:
// Ill-formed, no diagnostic required
template <int I> void f(A<I>, A<I+10>);
template <int I> void f(A<I>, A<I+1+2+3+4>);
但这不适用于上面的示例 g
函数。 T*
和 decltype(q)*
在类型等价的一些类似定义下可能被认为是功能等价的,但第 14.5.6.1 节只说明了表达式的替换,而不是类型.
最佳答案
标准有一个安静的未明确定义的类型等价规则,主要基于限定名称的语法,但对于模板参数,是参数列表中的位置和该列表的嵌套深度(即它是否是其中之一成员模板或封闭类模板的成员模板)。
typedef 会记住特定的依赖类型。然而,14.4p2 的 decltype 类型是一个不同的类型,不等同于 T。
关于c++ - 函数模板签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14420908/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!