C++ 当使用std::forward时,为什么我能够在传入r值时调用l值引用函数?
目前,我正在研究r值引用和移动语义,我在自己的编码实验中发现了一个奇怪的差异 鉴于以下代码:C++ 当使用std::forward时,为什么我能够在传入r值时调用l值引用函数?,c++,c++11,visual-c++,reference,perfect-forwarding,C++,C++11,Visual C++,Reference,Perfect Forwarding,目前,我正在研究r值引用和移动语义,我在自己的编码实验中发现了一个奇怪的差异 鉴于以下代码: #include <iostream> using namespace std; class X{}; void g(X&& t) // A { cout << "Rref call" << endl; } void g(X& t) // B { cout << "Lre
#include <iostream>
using namespace std;
class X{};
void g(X&& t) // A
{
cout << "Rref call" << endl;
}
void g(X& t) // B
{
cout << "Lref call" << endl;
}
template<typename T>
void f(T&& t)
{
g(forward<T>(t));
}
int main()
{
X x;
f(x); // 1
f(X()); // 2
return 0;
}
#包括
使用名称空间std;
类X{};
void g(X&t)//A
{
cout当您注释掉g(X&&t)
重载时,您使用的是允许将右值绑定到非常量
左值引用的。如果您将警告级别调到/W4
,MSVC将告诉您正在使用非标准扩展
gcc和clang都对代码中的重载进行了注释。您使用Visual Studio吗?如果是这样,它有一个允许临时变量绑定到非常量引用的方法。它失败了。James,看起来正是这样。正在发疯地试图弄清楚发生的逻辑。非常感谢。是的!正在使用Visual Studio,它很高兴地接受了这一点。非常感谢。这是MSVC中最可怕的错误之一。虽然在没有右值引用的时候它可能有一些意义,但现在它已经没有意义了。他们应该为C++11代码关闭它。@SergeyA如果你使用/W4
和/WX
编译,它会被关闭,就像你应该做的那样:)但是我不想这样做为他们找借口,这是一个可怕的延伸。