【问题标题】:warning C4238: nonstandard extension used : class rvalue used as lvalue警告 C4238:使用了非标准扩展:类右值用作左值
【发布时间】:2013-08-24 15:13:06
【问题描述】:

这是我的代码

   if(bSelected)
{
    clrTextSave=pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    clrBkSave=pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
    pDC->FillRect(rcAllLabels,&CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
}
else
    pDC->FillRect(rcAllLabels,&CBrush(m_clrTextBk));

当我在 Visual Studio 2008 上编译时,它给了我: 警告 C4238:使用了非标准扩展:类右值用作左值 我不知道如何解决这个警告?请有人帮忙吗?谢谢!

【问题讨论】:

  • pDC 警告点->FillRect(rcAllLabels,&CBrush(::GetSysColor(COLOR_HIGHLIGHT)));

标签: c++ visual-c++ visual-studio-2008 c++builder


【解决方案1】:

您收到警告(这应该是一个错误,因为您应该始终使用最高警告级别编译代码),因为您正在创建一个临时地址并使用它的地址。为防止出现此警告,您需要创建一个局部变量:

if(bSelected)
{
    clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
    CBrush brush(::GetSysColor(COLOR_HIGHLIGHT)); // create a local variable
    pDC->FillRect(rcAllLabels, &brush); // use its address
}
else
{
    CBrush brush(m_clrTextBk); // same thing here
    pDC->FillRect(rcAllLabels, &brush);
}

【讨论】:

  • 非常感谢 Zac Howland。现在看来运行良好
  • @DavidRodríguez-dribeas:你大错特错了:msdn.microsoft.com/en-us/library/7zyb9yb4.aspx
  • @ZacHowland:本地变量和临时之间存在巨大的差异。除非我误解了您的回答并且代码是问题的解决方案,如果是这样,那么抱歉评论。
  • @DavidRodríguez-dribeas:你有没有阅读我写的东西?我给他看了代码来解决他的问题...
  • @ZacHowland:是的,老实说,我并不清楚。 您正在创建一个临时地址并使用它的地址:[code goes here] 冒号通常用于提供前面解释的示例。在您的情况下,构造是矛盾的:您正在做 A: B。这让我很困惑。再次,抱歉评论(我已删除)
猜你喜欢
  • 2015-06-25
  • 2012-09-12
  • 2019-06-27
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多