Я получил эту ошибку, когда использовал 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
стали rvalue, тогда как *tempNames
является lvalue.
Как объясняет Билл Линч в комментариях, вы увеличиваете тип 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;
}
std::string
но я не хотел, чтобы было неясно, что он может делать это с char*
или чем-то еще.
*names
- это lvalue. Но вы не можете делатьnames++
. Вот где проблема.*names
- это ценность? Можете ли вы опубликовать код для поддержки этого утверждения?