Rumah >pembangunan bahagian belakang >C++ >Mengapakah `stringstream` Mengubah Suai Pembolehubah Sasaran pada Kegagalan Pengekstrakan dalam C 11 dan Kemudian?
Mengapa aliran rentetan >> Ubah Nilai Sasaran pada Kegagalan Pengekstrakan Selepas C 11?
"TC PL" Stroustrup menyatakan bahawa nilai pembolehubah sasaran harus kekal tidak berubah jika operasi istream atau ostream gagal. Walau bagaimanapun, ini bercanggah dengan tingkah laku yang diperhatikan dengan aliran rentetan:
#include <iostream> #include <sstream> int main() { std::stringstream ss; int v = 123; ss << "The quick brown fox."; if (ss >> v) { std::cout << "Unexpected success in reading a word into an int!\n"; } std::cout << "After extraction failure: " << v << "\n"; return 1; }
Kod ini mencetak "Selepas kegagalan pengekstrakan: 0," walaupun terdapat tuntutan Stroustrup.
C 11 Pengubahsuaian Tingkah Laku
Percanggahan ini berpunca daripada perubahan dalam tingkah laku rentetan selepas C 11. Sebelum C 11, stringstream menggunakan kaedah penghuraian gaya scanf, meninggalkan nilai sasaran tidak berubah apabila gagal. Walau bagaimanapun, sejak C 11, ia menggunakan std::strtoll, yang menulis sifar kepada pembolehubah nilai dan menetapkan failbit pada kegagalan pengekstrakan.
Perubahan ini sejajar dengan gelagat C 11 yang disemak bagi operasi istream dan ostream:
Kesimpulan
Manakala petikan Stroustrup menerangkan dengan tepat kelakuan operasi istream dan ostream sebelum C 11, tingkah laku pasca-C 11 stringstream menyimpang daripada penerangan ini disebabkan oleh penggunaan mekanisme pengekstrakan yang berbeza. Dalam C 11 dan seterusnya, adalah penting untuk mengetahui tingkah laku yang diubah ini apabila menggunakan operasi aliran rentetan.
Atas ialah kandungan terperinci Mengapakah `stringstream` Mengubah Suai Pembolehubah Sasaran pada Kegagalan Pengekstrakan dalam C 11 dan Kemudian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!