考虑以下最小示例:
// 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>
中,而不是旨在生成整数的类型。
最佳答案
对于那些在未来看到这一点的人,根据 T.C.和 ecatmur,这是 libstdc++ bug 65631 .虽然没有修复的预计到达时间;该行为符合最初的提议,但根据 N3037 paper 进行了更改以从概念中删除可复制性以解决 LWG 问题 1069。 .
关于c++ - 为什么 std::seed_seq 根据 C++11 是不可复制的,为什么 gcc/clang 不符合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29350040/