我试图理解组合初始化列表和C++ 11时应该是什么样的正确行为const auto.我在GCC和Clang之间获得了以下代码的不同行为,并想知道哪个是正确的:
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
const std::initializer_list<int> l1 = { 1, 2, 3 };
const auto l2 = { 1, 2, 3 };
std::cout << "explicit: " << typeid(l1).name() << std::endl;
std::cout << "auto: " << typeid(l2).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译输出是:
explicit: St16initializer_listIiE
auto: St16initializer_listIKiE
Run Code Online (Sandbox Code Playgroud)
而clang ++编译版本产生:
explicit: St16initializer_listIiE
auto: St16initializer_listIiE
Run Code Online (Sandbox Code Playgroud)
似乎GCC正在将这auto条线转变为std::initializer_list<const int>Clang生产的一段时间std::initializer_list<int>.当我使用它来初始化a时,GCC版本会产生问题std::vector.因此,以下在Clang下工作,但会为GCC产生编译器错误.
// Compiles under clang but fails for GCC because …Run Code Online (Sandbox Code Playgroud) 我知道,如果PYTHONHASHSEED环境变量未设置或设置为,"random"则哈希函数(用于set、frozenset和dict)将使用随机数加盐。
所以我想知道是否有可能找出程序的给定运行使用的值。
对于上下文,我的 Python 程序会生成一些输出,我想确保它对于程序的每次运行都是确定性的。在不同的点,程序会迭代各种set和frozenset对象中的值。对于迭代顺序将影响生成的输出的情况,我首先在迭代之前对元素进行排序。但代码相当复杂,因此并不总是很明显哪些情况需要排序,哪些情况不需要,而且我不想进行不必要的排序。
所以我想编写一些单元测试来捕获并修复需要添加排序迭代的情况。为了做到这一点,我计划使用multiprocessing.Process(在spawn模式下)运行程序,其中我显式设置了PYTHONHASHSEED环境变量。
但要做到这一点,我需要确定为相同输入产生不同输出的种子值。但我还没有找到任何有记录的 API 可以告诉我在给定的程序运行中使用了什么随机种子。