首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科技促进发展的作用::前进

科技促进发展的作用::前进
EN

Stack Overflow用户
提问于 2019-08-07 18:14:58
回答 1查看 64关注 0票数 1

下面是从this question带来的代码。

代码语言:javascript
复制
// [I]
void overloaded_function(const std::string& param) {
    std::cout << "const std::string& version: " << param << '\n';
}

// [II]
void overloaded_function(std::string&& param) {
    std::cout << "std::string&& version: " << param << '\n';
}

template <typename T>
void pass_through_f(T&& param) {
    overloaded_function(std::forward<T>(param));
}

template <typename T>
void pass_through(T&& param) {
    overloaded_function(param);
}

int main() {
    std::string str = "Hello World";

    pass_through_f(str);            // (1)
    pass_through_f(std::move(str)); // (2)

    std::cout << "----------\n";

    pass_through(str);              // (3)
    pass_through(std::move(str));   // (4)

    return 0;
}
代码语言:javascript
复制
const std::string& version: Hello World
std::string&& version: Hello World
----------
const std::string& version: Hello World
const std::string& version: Hello World

当我使用pass_through_f()时,(1)(2)之间的结果是不同的,但是在调用pass_though()时它们是相同的。

我的问题是,(4)的结果如何与(3)相同?下面是我认为的类型推断过程:

  1. (4)中,某些函数的返回值为r-值,因此T of pass_through()被推断为与传递的参数相同的类型。因此,Tstd::string&&
  2. std::string&&是r值引用,r值引用是r值,因此它调用overloaded_function() [II].因此,当使用std::forward时,它的结果是相同的。

但结果与我的想法不同。我想我误解了std::forward的工作方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 18:22:30

问题是在

代码语言:javascript
复制
template <typename T>
void pass_through(T&& param) {
    overloaded_function(param);
}

param是一个命名变量。因为它有一个名称,所以它是一个lvalue,即使它是对rvalue的引用。因为它是一个lvalue,所以调用lvalue函数。

如果它作为rvalue出现,则需要std::forward将其“重新转换”回rvalue。

还请注意,T不是string&&。由于您传递了一个string&&,所以T&&会将T演绎给string,并保留&&以使其成为一个rvalue引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57400153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档