Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ T和T常量上模板函数实例化的地址_C++_Function Pointers_Instantiation_Function Templates - Fatal编程技术网

C++ T和T常量上模板函数实例化的地址

C++ T和T常量上模板函数实例化的地址,c++,function-pointers,instantiation,function-templates,C++,Function Pointers,Instantiation,Function Templates,在以下设置中是否可能 template <typename T> inline void id() { //... } template <typename T> bool check() { return &id<T> == &id<T const>; } 模板 内联void(){ //... } 模板 布尔检查(){ 返回&id==&id; } check对于某些T,将返回true?它是否取决于在id中执行

在以下设置中是否可能

template <typename T>
inline void id() {
    //...
}

template <typename T>
bool check() {
    return &id<T> == &id<T const>;
}
模板
内联void(){
//...
}
模板
布尔检查(){
返回&id==&id;
}

check
对于某些
T
,将返回
true
?它是否取决于在
id
中执行的操作?标准对此有何规定?

当然。尝试
const int
int&
void()


有一条规则,如果通过
typedef
或模板参数获得多个顶级
const
限定符,则顶级
const
将崩溃,这意味着
check()
将返回
true

[标准文本待定]

然后有一条规则忽略了顶级的
const
,它不处理的东西,比如引用或函数类型。这意味着
check
check
将返回
true

§8.3.2[dcl.ref]p1

Cv限定引用的格式不正确,除非Cv限定符是通过使用typedef(7.1.3)或模板类型参数(14.3)引入的,在这种情况下,Cv限定符被忽略

§4.4[conv.qual]p3

[注:函数类型(包括指向成员函数类型的指针中使用的函数类型)从不符合cv(8.3.5)。-结束注]

§8.5.3[dcl.fct]p6

函数声明符中cv限定符seq的效果与在函数类型顶部添加cv限定符不同在后一种情况下,cv限定符将被忽略。


我认为这些函数是不相等的。虽然我怀疑标准允许它们相同(我不太知道在哪里可以找到相应的子句)。

可以返回false。试试看@juanchopanza我的错,当然我的意思是
true
。另一个复杂问题是,当生成的机器代码恰好相同时,MS VC++通常会合并模板代码。不符合标准,但节省空间。在每种情况下,标准都说明“添加了const”的那些类型的版本又是相同的类型。我添加了一些规范性文本,但我似乎找不到表示忽略typedefs或模板参数引入的重复cv限定符的一般措辞:(