【问题标题】:c++ assign value to a const QList in if... elsec++ 在 if...else 中为 const QList 赋值
【发布时间】:2013-04-17 15:10:32
【问题描述】:

我想根据指针的值为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 ;

我有编译器错误 Error 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 分配两个不同的值?那么正确的写法是什么?

【问题讨论】:

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


    【解决方案1】:

    使用三元运算符?:

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

    顺便说一句,是NULL 还是aList?你在上面的代码中都有。

    这个

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

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

    【讨论】:

      【解决方案2】:

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

      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 forbid,C++98),除了调用另一个函数/方法之外,剩下的解决方案很少,缺点是你必须将任何局部变量作为参数传递您需要计算 const 值。


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

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

      【讨论】:

      • 不错的 lambda 用例。
      • @leemes:是的,我不久前发现了它(我相信是在 H.Sutter 的博客上),它给我留下了深刻的印象,它是解决这个老问题的一个很好的解决方案。从那时起,每当话题出现时,我都会尝试传播它。 ;)
      • 实际上在我们当前工作的项目中,我们使用了很多 const 智能指针,但是当创建一个新对象并为其设置属性时,它不应该(还)是 const,但我们必须返回一个 const 指针或使用 const 指针继续下一步。我们当前的“我们能得到的最好的”解决方案是首先保持指针非 const 和非智能,并在它应该是 const 时只在 return 语句中“包装”它。当我在这种情况下集成您的解决方案时,它将取得很好的改进。谢谢!
      【解决方案3】:

      如果你这样做

      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 中更改。

      您可以使用const_cast 进行破解,但这是不好的做法,因此您必须初始化zoneList

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 2018-09-20
        • 2016-06-27
        相关资源
        最近更新 更多