2015-11-30 3 views
4

У меня есть следующий фрагмент кода:Почему этот код std :: string C++ не дает ошибку компиляции?

#include <string> 

int main(int argc, char *argv[]) 
{ 
    std::string a, b, c; 
    a + b = c; 
    return 0; 
} 

Почему это не C++ код дать время компиляции ошибка? Вероятно, это связано с тем, как был реализован std::string::operator+, но затем мой вопрос: почему он был реализован таким образом? В каких случаях такое поведение необходимо?

+1

Почему это дало ошибку компиляции? a + B возвращает действительный строковый объект. как для использования? он не может быть использован –

+4

@DavidHaim OP, вероятно, ожидает, что он потерпит неудачу по тем же причинам, что и он «a, b, c' был' int'. – juanchopanza

+0

Может ли кто-нибудь указать допустимый вариант использования? –

ответ

8

Вы можете назначить временные объекты. Не существует правила, предотвращающего это.

Если вы не хотите функцию-член будет вызван на временной (на г-значение, в более общем случае), вы можете использовать ref-qualifier в объявлении функции.

Но как вы можете видеть here, std::string::operator= не имеет исх квалифицированное версии.

Я не думаю, что Стандартный комитет допускал такое поведение с определенной целью; Я полагаю, что обоснование этого выбора состоит в том, чтобы навязать программисту меньшее количество правил и позволить ему найти полезное приложение, если оно существует.

+0

Я думаю, проблема, временная временная. Результат для класса X a, b, c; a + b = c; 'может быть желательным, когда временные данные приводят к обновлению некоторого модифицированного глобального состояния. – mksteve

+0

Оператор присваивания с побочными эффектами звучит как огромный противник для меня – DarkWanderer

+0

@DarkWanderer Я не знаю, может ли * throwing * быть побочным эффектом, но, безусловно, оператор присваивания может бросить. –

Смежные вопросы