【问题标题】:Non lvalue in assignment error [duplicate]分配错误中的非左值[重复]
【发布时间】:2014-11-30 04:36:08
【问题描述】:

当我使用names 打印字符串时出现此错误,但使用tempNames 时没有错误。

char* names[] = { "JIM",
                  "RAM",
                  "SAM",
                  0  };
int main(int argc, char *argv[])    
{
    char** tempNames = names ;        
    while(*names != 0)
        std::cout << *names++ << std::endl ; 
    return 0;
}

为什么*names 变成了右值,而*tempNames 变成了左值。

【问题讨论】:

  • *names 是一个左值。但是你不能做names++。这就是问题所在。
  • 是什么让你认为*names 是一个右值?您可以发布一些代码来支持该声明吗?

标签: c++ pointers lvalue rvalue


【解决方案1】:

正如Bill Lynch 在 cmets 中解释的那样,您正在递增类型 char* [],这是不允许的。 (如果您将其视为 int [] 类型会更容易。)当您分配给 char** 时,您可以递增它。

或者更好的基于 C++ 迭代器的解决方案 C++11:

char* names[] = { "JIM",
                  "RAM",
                  "SAM" };


int main(int argc, char *argv[])
{

    char** tempNames = names ;

    for(auto i = std::begin(names); i != std::end(names); ++i){
        std::cout << *i << std::endl;
    } 

    return 0;
}

【讨论】:

  • 如果你要给出一个现代的 c++ 变种,至少要全力以赴:gist.github.com/sharth/10f767045f2fe335f95c
  • @BillLynch 我同意他应该使用std::string,但我不希望人们不清楚他可以使用char*s 或其他方式。
  • 感谢您的回答,但我的问题有所不同,为什么 *names++ 是右值,而 *tempNames++ 是左值?
  • @Manesh 没错,如果您使用迭代器,您会发现它可以解决您的问题。老实说,我很难理解为什么。我认为这是增量以某种方式让编译器感到困惑。好吧,无论如何迭代器的语法更好,所以就是这样。
  • @JonathanMee:这是精简后的代码:int x[5]; x++;,这会导致编译器错误:无法增加“int [5]”类型的值
猜你喜欢
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2020-08-02
相关资源
最近更新 更多