有条件的运营商问题

lau*_*ura 8 c++ conditional-operator

我在使用条件运算符获取对象的引用时遇到了一些麻烦.我有一个类似于这样的设置:

class D
{
    virtual void bla() = 0;
};

class D1 : public D
{
    void bla() {};
};

class D2 : public D
{
    void bla() {};
};

class C
{
public:
    C()
    {
        this->d1 = new D1();
        this->d2 = new D2();
    }

    D1& getD1() {return *d1;};
    D2& getD2() {return *d2;}
private:
    D1 *d1;
    D2 *d2;
};

int main()
{    
    C c;    
    D& d = (rand() %2 == 0 ? c.getD1() : c.getD2());    
    return 0;    
}
Run Code Online (Sandbox Code Playgroud)

编译时,这给了我以下错误:

WOpenTest.cpp: In function 'int
main()': WOpenTest.cpp:91: error: no
match for conditional 'operator?:' in
'((((unsigned int)rand()) & 1u) == 0u)
? c.C::getD1() : c.C::getD2()'
Run Code Online (Sandbox Code Playgroud)

据我所知,根据C++标准,这是非法的(如本博文所示),但我不知道如何在D不使用条件运算符的情况下获取引用.

有任何想法吗?

Joh*_*itb 14

进入D&两个分支:

D& d = (rand() %2 == 0 ? static_cast<D&>(c.getD1()) : static_cast<D&>(c.getD2()));
Run Code Online (Sandbox Code Playgroud)