Рассмотрим следующий пример: минимальныйПочему std :: seed_seq не копируется в соответствии с C++ 11, и почему gcc/clang не соответствует?
// main.cpp
#include <random>
int main(int, char **)
{
std::seed_seq seed1{1337, 42};
std::seed_seq seed2(seed1);
std::seed_seq seed3 = seed2;
return 0;
}
Согласно стандарту C++, это не должно компилировать, так как std::seed_seq
ни copy constructible, ни copy assignable.
Однако, это нормально компилируется с обоими g++ 4.9
и clang 3.4
g++-4.9 -std=c++11 -Wall main.cpp
clang++ -std=c++11 -Wall main.cpp
llvm-libc++
Реализация Android NDK, кажется, следовать "не Copyable" свойство seed_seq
. Что может быть подтверждено в источнике на
android-ndk-r10d/sources/cxx-stl/llvm-libc++/libcxx/include/random:3553
Или компилируя минимальный пример использования
${NDK_HOME}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ \
-std=c++11 -c -Wall \
-I${NDK_HOME}/sources/cxx-stl/llvm-libc++/libcxx/include \
-I${NDK_HOME}/sources/cxx-stl/llvm-libc++/../llvm-libc++abi/libcxxabi/include \
-I${NDK_HOME}/sources/cxx-stl/llvm-libc++/../../android/support/include \
-isystem ${NDK_HOME}/platforms/android-18/arch-arm/usr/include \
main.cpp
Я ранее использовал это (не будучи в курсе моего несоответствующего кода) в . хранить копию семян для регистрации целей *
Я оставил интересно:
Почему это
seed_seq
не подлежит переписке?Это первый раз, когда я столкнулся с
g++
иclang
, чтобы не соответствовать стандарту. Является ли сознательное решение отклоняться от стандарта, или это ошибка реализации? Насколько распространено это? Я хотел бы узнать больше.
* Я понял, что я имел в виду seed_seq
неправильно, и что если я заинтересован только в seed_seq::param
значений (seed_seeq
«s начальные значения семян), что я должен вместо держать свою копию в vector<T>
вместо типа, предназначенного для генерации целых чисел.
gcc и clang часто используют ту же реализацию библиотеки C++ (libstdC++), поэтому, когда в ней есть проблемы, они будут видны либо в gcc, либо в clang. Это не значит, что две независимые разработчики считают, что это хорошая идея. – hvd
Я подтвердил, что и clang, и gcc использовали один и тот же файл '/ usr/include/C++/4.9/bits/random.h'. Я не знал об этом, хотя теперь, когда я думаю об этом, я был смущен этим раньше, и теперь это имеет смысл. Спасибо. Хорошо знать. – swalog
[Эта программа правильно не компилируется с libC++] (http://coliru.stacked-crooked.com/a/d3734e02eb6e1da0), поэтому это проблема libstdC++. – Casey