为什么在一个已经是右值引用的函数参数上需要std :: move?

时间:2016-05-06 17:50:54

标签: c++11

在下面的代码中,为什么第一次调用g会解析为参考版本,即使s已经是右值引用?

#include <string>
#include <iostream>
#include <utility>

void g(const std::string& s) {
    std::cout << "g(const std::string&)\n";
}

void g(std::string&& s) {
    std::cout << "g(std::string&&)\n";
}

void f(std::string&& s) {
    static_assert(std::is_same<decltype(s), std::string&&>::value,
                  "s is not std::string&&");
    static_assert(!std::is_same<decltype(s), std::string&>::value,
                  "s magically changed to std::string&");
    g(s);
    g(std::move(s));
}

int main() {
    f("abc");
    return 0;
}

输出:

g(const std::string&)
g(std::string&&)

正如static_asserts所示,s并没有神奇地开始被视为函数体中的左值引用,因为我看到有些人断言(或者我误解了他们所说的内容)。

(注意:经过一番调查后,我认为我已经找到了合理的答案;但我完全不确定它是否准确。所以,我想发帖我提出的答案并对此发表评论。抱歉,如果这不是正确的方式来询问我的答案是否正确 - 但具有讽刺意味的是,meta.stackoverflow.com告诉我,我无法提出问题直到提出问题为止我已经问了一些问题。)

0 个答案:

没有答案