【问题标题】:IUnknown pointer referenceIUnknown 指针引用
【发布时间】:2013-11-02 07:25:09
【问题描述】:

为什么 Visual Studio 编译器很满意

void fn(int *&i) 
{
    ;
}

void fn(IUnknown *const &p)
{
    ;
}

但不是

void fn(IUnkown *&p)
{
    ;
}

称呼它的样子

IDXGIFactory *df = nullptr;
// init df
fn(df);

编译错误是

3 IntelliSense:无法使用“IDXGIFactory *”类型的值初始化“IUnknown *&”类型的引用(非 const 限定)c:\Users\Carl\Documents\Visual Studio 2013\Projects\Project1\项目5\main.cpp 29 10 项目5

我在研究中发现的最接近的事情是编译器一次只会进行一次类型转换,但这不可能是正确的,因为 const & 版本应该会中断类型和常量转换;但是实际上无法编译的是 & 版本。

【问题讨论】:

    标签: c++ visual-c++ dxgi visual-c++-2013


    【解决方案1】:

    非常量左值引用(如IUnknown*&)只能绑定到一个左值;它不能绑定到 rvalue。一个 const 限定的左值引用(如 IUnknown* const&可以绑定到一个 右值

    考虑一个不涉及指针或函数调用的更简单的情况会更容易:

    int i = 0;
    
    double        x = i; // (1) Well-formed
    double const& y = i; // (2) Well-formed
    double&       z = i; // (3) Ill-formed
    

    这里,iint 类型的对象。在表达式中使用i 时,它是一个左值

    (1)中,我们从iint类型)初始化对象xdouble类型)。类型不匹配,但这没关系,因为存在从intdouble 的隐式转换。这个转换的“结果”是一个double类型的rvalue表达式(*),用于初始化x

    (2) 中,我们从i 初始化常量限定引用ydouble const& 类型)。同样,类型不匹配,因此使用隐式转换将int 转换为double。这种转换的“结果”是一个右值。如开头所述,const 限定引用可以绑定到 rvalue,因此y 绑定到转换的“结果”。

    (3)中,我们尝试从i 初始化非常量引用zdouble& 类型)。类型不匹配,因此需要进行转换。此处不能使用转换,因为转换的“结果”是一个右值,并且如开头所述,非常量引用不能绑定到一个右值 .

    C++ 有特殊规则允许 const 左值引用绑定到 rvalue 表达式。您可以从 StackOverflow 上的其他问题中找出原因,例如 "How come a non-const reference cannot bind to a temporary object?"

    您的情况与此情况完全相同:参数的类型(IDXGIFactory*)与参数的类型(IUnknown* 或对其的引用)不同,因此需要隐式转换将实参转换为参数类型(在这种情况下,它是从指向派生类的指针指向基类的指针的转换)。然而,这种转换的“结果”是一个右值表达式,因此它不能绑定到非常量引用IUnknown*&


    (*)真的是prvalue;为简单起见,我在此答案中使用了 C++98 表达式分类法。有关 C++11 值类别的信息,请参阅 this question

    【讨论】:

    • the "result" of the conversion is an rvalue 是我所缺少的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2020-04-13
    • 2015-02-13
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多