使用 if 语句分配引用?

Assigning a reference with if statements?

在 C++ 中,我们可以使用条件运算符来分配引用:

int main (int argc, char *argv[])
{
    int i, j;
    int &k = (false) ? i : j;
}

是否可以使用 if-else 语句来做到这一点?我不知道你该怎么做,因为你不能重新分配参考。

当然可以,但你可能不想。

int main(int argc, char *argv[])
{
    int i, j;
    bool cond = false;
    int &k = [&]() -> int& { if (cond) return i; else return j; }();
}

或者,如果您对愚蠢的 lambda 技巧过敏:

int& pickARef(bool cond, int& trueRef, int& falseRef)
{
    if (cond)
    {
        return trueRef;
    }
    else
    {
        return falseRef;
    }
}


int main(int argc, char *argv[])
{
    int i, j;
    bool cond = false;
    int &k = pickARef(cond, i, j);
}

我觉得这两个都不是好主意。

不太理想,但是当你需要一个可重新赋值的引用时你可以使用std::reference_wrapper,例如:

#include <functional>

int main (int argc, char *argv[])
{
    int i, j;
    std::reference_wrapper<int> k;
    if (condition)
        k = i;
    else
        k = j;
    // use k/k.get() as needed
}

不过,在这种情况下,我只会使用指针来代替:

int main (int argc, char *argv[])
{
    int i, j;
    int *k;
    if (condition)
        k = &i;
    else
        k = &j;
    // use *k as needed
}