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

标签 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.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

我以前曾使用它(没有意识到我的不合格代码)来存储种子的拷贝以用于日志记录目的。*

我想知道:

  1. 为什么会这样 seed_seq不可复制?

  2. 这是我第一次遇到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/

相关文章:

c++ - 左边的右值

c++11 - 从 LLVM 调用 Win32/64 函数的正确方法是什么?

c++ - 我必须关心 C++ 结构末尾的填充吗?我保证我不会在数组中使用它

c++ - 如何将 glut 库嵌入到 C++ 项目中?

c++ - super 简单的 C++ 构造函数查询

android - 如何在不使用 mbstowcs 的情况下在 C++ 中将 ASCII char* 转换为 wchar_t*?

c++ - 右值引用被视为左值?

c++ - istream 的 tellg/seekg 无法防止堆栈粉碎(g++)?

c++ - 将新子目录添加到 HKEY_LOCAL_MACHINE\Software\Classes 后如何更新 HKEY_CLASSES_ROOT

c++ - 我输出中的 D3D11 INFO 行是什么意思?