kir*_*off 3 c++ const const-correctness variable-assignment conditional-statements
我想const QList根据指针的值为a赋值.
invar是一个指针,如果它是NULL我想要分配第一个值const QList mylist,如果不是NULL,另一个值.但是观察到了正确性:我不打算在mylist之后改变价值.
是否有可能
if(invar)
const QList<Type> zoneList = invar->getZones();
else
const QList<Type> zoneList = aList ;
Run Code Online (Sandbox Code Playgroud)
我zoneList确切地定义了一次,为什么这不起作用?
另外,正如我zoneList在我的方法的下一部分中使用的那样,我得到了这个编译错误:undeclared identifier.
但我也不允许这样写
const QList<Type> zoneList ;
if(invar)
zoneList = invar->getZones();
else
zoneList = NULL ;
Run Code Online (Sandbox Code Playgroud)
我有编译器错误错误1
error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const QList<T>' (or there is no acceptable conversion)
Run Code Online (Sandbox Code Playgroud)
是否可以根据条件为此const QList分配两个不同的值?那么写它的正确方法是什么?
使用三元运算符 ?:
const QList<Type> zoneList(invar ? invar->getZones() : aList);
Run Code Online (Sandbox Code Playgroud)
BTW是它NULL还是它aList?您在上面的代码中都有.
这个
if(invar)
const QList<Type> zoneList = invar->getZones();
else
const QList<Type> zoneList = aList ;
Run Code Online (Sandbox Code Playgroud)
不起作用,因为每个zoneList变量仅在if语句中定义.
有了这样一个简单的条件,你可以只使用三元运算符:
const QList<Type> zoneList = invar ? invar->getZones() : aList;
Run Code Online (Sandbox Code Playgroud)
如果初始化变得比这更复杂并且您碰巧使用 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
Run Code Online (Sandbox Code Playgroud)
如果您坚持使用 C++03(或禁止 Stroustrup,C++98),除了调用另一个函数/方法之外,剩下的解决方案很少,缺点是您必须将任何需要的局部变量作为参数传递计算常量值。
编辑:我意识到我还没有完全回答你的问题。其他人已经解释过你的第一个if不能工作,因为它是一个范围问题,我不会添加太多,除了添加大括号可能会让你更清楚(注意这与你的代码完全相同:大括号是当if/else主体只是一个单独的语句但它们的存在/不存在不会改变代码的语义时可选):
if (invar) {
const QList<Type> zoneList = invar->getZones();
}
else {
const QList<Type> zoneList = aList;
}
Run Code Online (Sandbox Code Playgroud)