gpt4 book ai didi

c++ - 模板函数未使用右值引用实例化/接收调用

转载 作者:行者123 更新时间:2023-11-28 04:18:14 25 4
gpt4 key购买 nike

如标题中所述,当我显式实例化一个函数的左值和右值版本时它可以工作,如果我尝试使用模板这样做则不会。海合会 7.4。我错过了什么?

class Test {};

class Explicit {
public:
void func (const Test &t) {
cout << std::is_rvalue_reference<const Test&>::value << endl;
}

void func (Test &&t) {
cout << std::is_rvalue_reference<Test&&>::value << endl;
}
};

class Implicit {
public:
template<class T>
void func (T t) {
cout << std::is_rvalue_reference<T>::value << endl;
}
};

// explicitly instantiate two versions of the function
template void Implicit::func<const Test &> (const Test &);
template void Implicit::func<Test &&> (Test &&);

int main () {
Explicit e = Explicit ();
Implicit i = Implicit ();
Test t;

e.func (t); // goes to func (const Test&), as expected
e.func (Test ()); // goes to func (Test&&), as expected
e.func ((Test &&) Test ()); // goes to func (Test&&), as expected

i.func (t); // goes to func (const Test&), as expected
i.func (Test ()); // goes to func (const Test&), not as expected!
i.func ((Test &&) Test ()); // goes to func (const Test&), not as expected!
}

最佳答案

您的显式实例化是无用的(当您拆分 header 和 cpp 时可能会有用):

// explicitly instantiate two versions of the functions
template void Implicit::func<const Test &> (const Test &);
template void Implicit::func<Test &&> (Test &&);

对于您的“隐式”,您实际上得到了:

i.func (t);                 // goes to func(Test)
i.func (Test ()); // goes to func(Test)
i.func ((Test &&) Test ()); // goes to func(Test)

作为

template<class T> void func (T t)

不推导引用。

然后你调用void Implicit::func<Test> .

关于c++ - 模板函数未使用右值引用实例化/接收调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56083013/

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