2016-01-25 2 views
3

Один пример из Sutter & стандарты кодирования Alexandrescu поймала мой взгляд «. Пример 2: std::string::append (ошибка Постусловие) При добавлении символа в строку, неспособность выделить новый буфер, если существующий один полностью блокирует операцию от выполнения документированной функции и обеспечивает ее документированные пост-условия, и поэтому является ошибкой ».Использование * это в качестве возвращаемого значения

Я не могу себе представить, что в любых нормальных условиях можно было бы проверить возвращаемое значение из append, но было любопытно, что это за значение, и оно оказывается *this (которое может использоваться только внутри нестатической функции-члена) , Я полагаю, можно проверить длину строки до и после добавления, , но как можно получить доступ к *this?

Например: проверка

std::string::s = "Hello World"; 
for (int i=0; i<many millions; ++i) { 
    s.append(s); 
} 
s.append("."); // Which we assume fails due to a buffer error. 
+9

Возвращаемое значение не для проверки. Он предназначен для использования. – juanchopanza

+1

Я думаю, что здесь есть возвращаемое значение, чтобы вы могли писать такие вещи, как 'std :: cout << s.append (« Something »);'. –

+0

Можете ли вы также использовать возвращаемое значение для вызова метода цепи? Например, 's.append (« Something »). Append (« другая строка »);'? – AaronCarson

ответ

6

Ошибка в объекты, как string, а также большую часть стандартной библиотеки осуществляется с помощью исключений, а не с помощью возвращаемых значений.

Если append не работает, он выйдет через исключение, в противном случае операция будет выполнена успешно, и вы получите действительное возвращаемое значение. Поэтому проверка ошибок в возвращаемом значении не является ни необходимой, ни возможной.

Как указано в комментариях, указанное возвращаемое значение затем может использоваться, например, цепных операций.

+0

Правильнее сказать: «Это будет _leave control_ через исключение». – edmz

+1

@black Я не совсем понимаю, как это было бы правильнее, что не так с «выходом»? –

+0

Потому что это то, что делают исключения: оставьте текущий поток управления программой. Исключения сами по себе не «выходят». – edmz

0

Если вы действительно хотите, вы можете кэшировать возвращаемое значение в локальной переменной в цикле и проверить его содержимое, но это было бы излишним:

std::string s = "Hello World"; 
for (int i=0; i<many millions; ++i) 
{ 
    std::string s2 = s.append(s); 
    if (s2.size() == 42) 
    { 
    break; // or some kind of check 
      // but as others said, exceptions are better 
    } 
} 
+0

Примечание: я больше знаком с чистыми C и Java, чем с C++, если я допустил ошибку с синтаксисом (не был уверен, что кешированное значение должно быть указателем или ссылкой или просто строкой), кто-то может убедиться, что он проверяет мой пример кода или исправить его. – AaronCarson