c ++在if ... else中为const QList赋值

时间:2013-04-24 07:15:27

标签: c++ const variable-assignment conditional-statements const-correctness

我想根据指针的值为const QList赋值。

invar是一个指针,如果它是NULL我想为const QList mylist分配第一个值,如果它不是NULL,则为另一个值。但是观察到const正确性:我不打算之后更改mylist的值。

是否有可能

if(invar)
    const QList<Type> zoneList = invar->getZones();
else
    const QList<Type> zoneList = aList ;

我确切地定义了zoneList,为什么这不起作用?

另外,因为我在方法的下一部分中使用zoneList,我得到了这个编译错误:undeclared identifier

但我不允许写那个

    const QList<Type> zoneList ;

    if(invar)
        zoneList = invar->getZones();
    else
        zoneList = NULL ;

我有编译器错误错误1

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const QList<T>' (or there is no acceptable conversion)  

是否可以根据条件为此const QList分配两个不同的值?那么写它的正确方法是什么?

3 个答案:

答案 0 :(得分:8)

使用三元运算符?:

const QList<Type> zoneList(invar ? invar->getZones() : aList);

BTW是NULL还是aList?您在上面的代码中都有。

if(invar)
    const QList<Type> zoneList = invar->getZones();
else
    const QList<Type> zoneList = aList ;

不起作用,因为每个zoneList变量仅在if语句中定义。

答案 1 :(得分:4)

有了这么简单的条件,你可以使用三元运算符:

const QList<Type> zoneList = invar ? invar->getZones() : aList;

如果初始化变得比这更复杂并且您碰巧使用C ++ 11,那么您可以使用lambdas提供的新习语:

const QList<Type> zoneList = [] () -> QList<Type> {
                          // ^^ possibly [&] to capture variables

        // some complex stuff that returns a QList<Type>

    }(); // Note the () that calls the lambda immediately

如果您遇到C ++ 03(或Stroustrup禁止,C ++ 98),除了调用另一个函数/方法之外,还有一些解决方案,缺点是您必须将任何局部变量作为参数传递你需要计算const值。


编辑:我意识到我还没有完全回答你的问题。其他人已经解释过你的第一个if无法工作,因为它是一个范围问题,我不会添加太多,除了添加括号可能会让你更清楚(请注意这是如何严格相同的代码你的:当if / else主体只是一个语句但它们的存在/不存在不会改变代码的语义时,大括号是可选的:

if (invar) {
    const QList<Type> zoneList = invar->getZones();
}
else {
    const QList<Type> zoneList = aList;
}

答案 2 :(得分:1)

如果你这样做

if(invar)
    const QList<Type> zoneList = invar->getZones();
else
    const QList<Type> zoneList = aList ;

zoneList的范围仅限于ifelse分支,并且在其外部不再存在。
如果你这样做

const QList<Type> zoneList ;

if(invar)
    zoneList = invar->getZones();
else
    zoneList = NULL ;

zoneList已声明const,无法在if / else中更改。

对于hack,您可以使用const_cast,但这是不好的做法,因此您必须初始化zoneList

zoneList = invar != 0 ? invar->getZones() : 0; //don't use NULL in C++