gpt4 book ai didi

c++ - 无法在成员函数中将左值绑定(bind)到右值,但在全局函数中可以

转载 作者:行者123 更新时间:2023-12-03 10:05:17 25 4
gpt4 key购买 nike

在查看 std::forward 的引用页时我遇到了一些奇怪的事情。该示例将左值作为右值引用传递......但传递给全局函数......并且它编译并运行。我尝试了与成员函数相同的操作,但无法编译。是什么赋予了?如果不使用 std::move,我希望这两个调用都会失败。或 std::forward<T> .

#include <iostream>

template <typename T>
void globalDoSomething(T &&data) {
std::cout << "We're doing it!!" << std::endl;
}

template <typename T>
class A {
public:
void doSomething(T &&data);
};

template <typename T>
void A<T>::doSomething(T &&data)
{
std::cerr << "Ah, man. I won't compile." << std::endl;
}

template class A<int>;

int main()
{

int b = 0;
globalDoSomething(b);

A<int> a;
a.doSomething(b);

return 0;
}

最佳答案

这是因为globalDoSomething的自动模板扣减推断 Tint& .
如果您使用 globalDoSomething<int>(b); 显式实例化模板函数就像您对模板类的成员函数所做的那样,它也将无法编译。
相反,如果您使用 A<int&> a; 实例化模板类,它将成功编译。

关于c++ - 无法在成员函数中将左值绑定(bind)到右值,但在全局函数中可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65514725/

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