2014-11-30 4 views
0

Я получил эту ошибку, когда использовал 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 является именующим.

+1

'* names' является именующим. Но вы не можете использовать 'names ++'. Вот в чем проблема. –

+0

Что заставляет вас думать, что '* names' является rvalue? Можете ли вы опубликовать некоторый код для поддержки этого требования? –

ответ

0

Как Bill Lynch объясняет в комментариях, что вы увеличиваете тип 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; 
} 
+1

Если вы собираетесь дать современный вариант C++, по крайней мере, изо всех сил: https://gist.github.com/sharth/10f767045f2fe335f95c –

+0

@BillLynch Я согласен с тем, что он должен использовать 'std :: string', но я не использовал хотите, чтобы было непонятно, что он мог бы сделать это с помощью 'char *' s или что-то еще. –

+1

Спасибо за ответ, но мой вопрос отличается, почему * имена ++ - это rvalue, а * tempNames ++ - это lvalue? – Mahesh