为什么std :: seed_seq根据C++ 11是不可复制的,为什么gcc/clang不符合?

swa*_*log 9 c++ g++ libstdc++ c++11

请考虑以下最小示例:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

根据C++标准,这不应该编译,因为std::seed_seq既不是可复制的,也不是可复制的.

然而,这个编译罚款既g++ 4.9clang 3.4

g++-4.9 -std=c++11 -Wall main.cpp
clang++ -std=c++11 -Wall main.cpp
Run Code Online (Sandbox Code Playgroud)

android ndk的llvm-libc++实现似乎遵循了"不可复制"的属性seed_seq.哪个可以在源头确认

 android-ndk-r10d/sources/cxx-stl/llvm-libc++/libcxx/include/random:3553
Run Code Online (Sandbox Code Playgroud)

或者通过编译最小的例子

 ${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
Run Code Online (Sandbox Code Playgroud)

我之前使用过这个(不知道我的不符合代码)来存储种子的副本以用于记录目的.*

我想知道:

  1. 为什么seed_seq不可复制?

  2. 这是我第一次遇到g++并且clang不符合标准.是否有意识地决定偏离标准,或者这是一个实现错误?这有多普遍?我想了解更多.


*我意识到我在想seed_seq错,如果我只对seed_seq::param值(seed_seeq初始种子值)感兴趣,我应该将我的副本保留在a中vector<T>,而不是用于生成整数的类型.

LTh*_*ode 2

对于那些将来看到这一点的人,根据 TC 和 ecatmur,这是libstdc++ bug 65631。不过目前还没有修复的预计时间;该行为符合原始提案,但根据N3037 论文,这一点已被更改,以消除概念中的可复制性,以解决 LWG 问题 1069 。