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

时间:2015-03-30 15:21:53

标签: c++ c++11 g++ libstdc++

考虑以下最小例子:

// 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.9clang 3.4

g++-4.9 -std=c++11 -Wall main.cpp
clang++ -std=c++11 -Wall main.cpp

android ndk的llvm-libc++实现似乎遵循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不符合标准。是否有意识地决定偏离标准,或者这是一个实现错误?这有多普遍?我想了解更多。


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

1 个答案:

答案 0 :(得分:1)

对于那些将来看到这一点的人,按照T.C.和ecatmur,这是libstdc++ bug 65631。虽然修复没有ETA;行为符合原始提案,但根据N3037 paper,已更改为从概念中移除可复制性以解决LWG问题1069。