在下面的代码中,为什么第一次调用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告诉我,我无法提出问题直到提出问题为止我已经问了一些问题。)