Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当使用std::forward时,为什么我能够在传入r值时调用l值引用函数?_C++_C++11_Visual C++_Reference_Perfect Forwarding - Fatal编程技术网

C++ 当使用std::forward时,为什么我能够在传入r值时调用l值引用函数?

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

目前,我正在研究r值引用和移动语义,我在自己的编码实验中发现了一个奇怪的差异

鉴于以下代码:

#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
编译,它会被关闭,就像你应该做的那样:)但是我不想这样做为他们找借口,这是一个可怕的延伸。