C++ 赋值错误中的非左值

C++ 赋值错误中的非左值,c++,pointers,lvalue,rvalue,C++,Pointers,Lvalue,Rvalue,我在使用名称打印字符串时出现此错误,但在使用tempNames时没有错误 为什么*names变为右值,而*tempNames变为左值。正如注释中所解释的那样,您正在递增类型char*[],这是不允许的。如果将其视为int[]类型,则更容易实现。当您分配给字符**时,您可以将其递增 或更好的基于C++迭代器的解决方案C++ 11: char* names[] = { "JIM", "RAM", "SAM" }; int m

我在使用名称打印字符串时出现此错误,但在使用tempNames时没有错误

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

正如注释中所解释的那样,您正在递增类型char*[],这是不允许的。如果将其视为int[]类型,则更容易实现。当您分配给字符**时,您可以将其递增

<>或更好的基于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;
}

*名称是左值。但是您不能使用names++。这就是问题所在。是什么让你认为*names是一个右值?你能发布一些代码来支持这个说法吗?如果你想给出一个现代的C++变体,至少要全力以赴:@比林林奇,我同意他应该使用STD::string,但是我不希望他不知道他可以用char s或者什么来做这个。谢谢你的回答,但是我的问题是不同的,为什么名字+ ++是一个rValm,那么*tempNames++是左值吗?@Manesh是的,如果你使用迭代器,你会发现它会解决你的问题。老实说,我很难理解为什么。我想是增量让编译器感到困惑。迭代器只是更好的语法而已,就是这样。@JonathanMee:这是简化后的代码:int x[5];x++;这导致编译器错误:无法增加“int[5]类型的值”
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;
}