c++中给const QList赋值其他的事情

c++ assign value to a const QList in if... else

本文关键字:其他 赋值 中给 const QList c++      更新时间:2023-10-16

我想根据指针的值给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取决于一个条件?那么正确的写法是什么呢

使用三元运算符?:

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语句中定义。

对于这样一个简单的条件,您可以只使用三元操作符:

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;
}

如果你这样做

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++