考虑以下最小例子:
// 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
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
我之前使用过这个(不知道我的不合规代码)来存储种子的副本以便记录。*
我想知道:
为什么seed_seq
不可复制?
这是我第一次遇到g++
和clang
不符合标准。是否有意识地决定偏离标准,或者这是一个实现错误?这有多普遍?我想了解更多。
*我意识到我在考虑seed_seq
错误,如果我只对seed_seq::param
值(seed_seeq
的初始种子值)感兴趣,那我就是应该将我的副本保留在vector<T>
中,而不是用于生成整数的类型。
答案 0 :(得分:1)
对于那些将来看到这一点的人,按照T.C.和ecatmur,这是libstdc++ bug 65631。虽然修复没有ETA;行为符合原始提案,但根据N3037 paper,已更改为从概念中移除可复制性以解决LWG问题1069。