2015-03-30 2 views
9

Рассмотрим следующий пример: минимальныйПочему 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 

Я ранее использовал это (не будучи в курсе моего несоответствующего кода) в . хранить копию семян для регистрации целей *

Я оставил интересно:

  1. Почему это seed_seq не подлежит переписке?

  2. Это первый раз, когда я столкнулся с g++ и clang, чтобы не соответствовать стандарту. Является ли сознательное решение отклоняться от стандарта, или это ошибка реализации? Насколько распространено это? Я хотел бы узнать больше.


* Я понял, что я имел в виду seed_seq неправильно, и что если я заинтересован только в seed_seq::param значений (seed_seeq «s начальные значения семян), что я должен вместо держать свою копию в vector<T> вместо типа, предназначенного для генерации целых чисел.

+1

gcc и clang часто используют ту же реализацию библиотеки C++ (libstdC++), поэтому, когда в ней есть проблемы, они будут видны либо в gcc, либо в clang. Это не значит, что две независимые разработчики считают, что это хорошая идея. – hvd

+0

Я подтвердил, что и clang, и gcc использовали один и тот же файл '/ usr/include/C++/4.9/bits/random.h'. Я не знал об этом, хотя теперь, когда я думаю об этом, я был смущен этим раньше, и теперь это имеет смысл. Спасибо. Хорошо знать. – swalog

+3

[Эта программа правильно не компилируется с libC++] (http://coliru.stacked-crooked.com/a/d3734e02eb6e1da0), поэтому это проблема libstdC++. – Casey

ответ

1

Для тех, кто видит это в будущем, согласно T.C. и ecatmur, это libstdc++ bug 65631. Тем не менее, нет ETA для исправления; поведение соответствовало первоначальному предложению, но это было изменено для удаления возможности перераспределения из концепции для решения проблемы 1069 LWG, согласно N3037 paper.

+0

Чувствительно добавить ответ, который представляет собой обзор действий, совершаемых людьми, которые комментировали вопрос. (например, выдает ошибку 65631, выкапывая бумагу N3037). Я уверен, что те, кто это увидит в будущем, также будут видеть эти комментарии. Полагаю, вам нечего делать. – swalog

+0

@swalog - да, с полным резюме; Кроме того, нет смысла обсуждать вопрос без ответа, но с комментариями, которые дополняют ответ :) Вы предпочли бы, чтобы я создал эту вики сообщества? – LThode

+0

У меня нет желания, ставки или сказать в этом :-) Делай как хочешь. Однако, так как вы спрашиваете, предоставление кредита, когда кредит является обязательным, кажется правильным. – swalog

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