gpt4 book ai didi

C++ 模板特化 : unexpected function overload lookup result

转载 作者:太空狗 更新时间:2023-10-29 20:26:04 26 4
gpt4 key购买 nike

在尝试为 shared_ptr 编写一个包装器时,它会在支持继承类的同时向用户隐藏内存的分配和释放,我偶然发现了非常奇怪的错误,表明编译器在一个过程中查找了错误的函数重载,或者我关于混合重载和模板的知识是错误的。所以我写了这个东西来测试:

#include <iostream>

void out(int i) {
std::cout << i << '\n';
}

template <class T>
struct Inst {
template <class TT>
Inst(const TT &) {out(1);}
Inst(const Inst &) {out(2);}
template <class TT>
Inst(TT &&) {out(3);}
Inst(Inst &&) {out(4);}
Inst() {out(-1);}
~Inst() {out(1000);}
};

class K {};
class KK : K {};

int main() {
out(3000);
K k; KK kk; Inst<K> i;
Inst<K> I1{k};
Inst<K> I2{kk};
Inst<K> I3{i};
Inst<K> I4{K()};
Inst<K> I5{KK()};
Inst<K> I6{Inst<K>()};
out(2000);
}

我合理期望的是 I1I21I32 I4I53I64,并且至少有两个其他对象在不同的​​位置写入 -1。但是,当使用 -std=c++11 使用 gcc 4.8.2 进行编译时,我的机器跳过了一个对象,并为调用的所有其他非自动构造函数编写了 3 .我做错了什么?

最佳答案

Inst(TT &&) {out(3);} 中的 TT&& 有点特殊。所以,特别的是,甚至还有一个专门为它们创造的“术语”,称为 universal reference

简而言之,TT&& 不是您认为的那样。这里有两件事起作用:引用折叠模板推导

由于 TT 是一个模板参数,并且您将 && 放在它前面,这就是 T&& 在您的示例中的样子:

Inst<K> I1{k};  ---> Inst(K&) 
Inst<K> I2{kk}; ---> Inst(KK&)
Inst<K> I3{i}; ---> Inst(Inst<K>&)
Inst<K> I4{K()}; ---> Inst(K&&)
Inst<K> I5{KK()} ---> Inst(KK&&)

TT&& 变成了一个完全匹配,并且是您进行的所有调用的选定构造函数,这就是您看到 3 的原因对于每一个(iI6 除外)。

如需进一步阅读,请参阅:

Universal References and the Copy Constructor .

Advantages of using forward .

关于C++ 模板特化 : unexpected function overload lookup result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21391603/

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