Ответ 1
Это, очевидно, ошибка в некоторых стандартных реализациях библиотек. Я сделал больше работ по этому вопросу и, используя следующий код
#include <iostream>
#include <climits>
#include <vector>
int main() {
auto v = std::vector<char>();
std::cout << "Maximum size of a std::vector<char>: " <<
v.max_size() << std::endl;
std::cout << "Maximum value a std::size_t can hold: " <<
SIZE_MAX << std::endl;
std::cout << "Maximum value a std::ptrdiff_t can hold: " <<
PTRDIFF_MAX << std::endl;
return 0;
}
нетрудно показать, что:
- в libС++, используемый clang, max_size() возвращает PTRDIFF_MAX
- в libstdС++, используемом gcc 4.9.2, max_size() возвращает SIZE_MAX
- в реализации Visual Studio 2013 max_size() возвращает SIZE_MAX
Следовательно, libstdС++ и реализация стандартной библиотеки Microsoft имеют ошибку, но libС++ ее не имеет. Я напишу отчет об ошибках в отношении этих 2.
- Gcc. Сообщается как ошибка 65131. Он отклонен, поскольку ABI говорит, что для всех 32-битных ABI вы не можете выделить более половины адресного пространства. Эта проблема была ранее рассмотрена здесь: https://gcc.gnu.org/ml/gcc/2011-08/msg00221.html