Код, который вы показали, не является причиной сбоя. Полное определение _Shift
:
template
(std::numeric_limits<_UIntType>::digits)>
struct _Shift
{ static const _UIntType __value = 0; };
template
struct _Shift<_UIntType, __w, true>
{ static const _UIntType __value = _UIntType(1) << __w; };
При этом используется специализация шаблона для проверки размера _UIntType
во время компиляции. Первая версия используется, когда __w
больше или равно std::numeric_limits<_UIntType>::digits
, что имеет место в данном случае. Таким образом, результирующее значение равно 0, и сдвиг влево не выполняется.
Что касается самого сбоя: по-видимому, std::random_device
не работает в Windows GCC и дает детерминированные результаты (как вы сами видели). Это также может быть связано с причиной аварии. Этот вопрос столкнулся с аналогичным сбоем, также с GCC 8.2 на Windows.
В качестве обходного пути вы можете использовать библиотеку Boost.Random
, которая реализует тот же API.
Как Bill сказал, Python действительно имеет конструкцию
from X import *
но можно также явно указать, какие имена Вы хотите импортированный из модуля (пространство имен):
from X import foo, bar, blah
Это имеет тенденцию делать код еще более читаемым/легче для понимания, начиная с кого-то видящего, что идентификатор в источнике не должен искать через все импортированные модули для наблюдения, куда он прибывает из. Вот связанный вопрос: Спецификация Пространства имен В Отсутствие Ambuguity
Править: в ответ на комментарий Мира я упомяну, что можно также записать вещи как
import X.foo
но затем необходимо будет записать
X.foo.moo()
вместо просто
foo.moo()
Это - не обязательно плохая вещь, конечно. Я обычно использую смесь from X import y
и import X.y
формы, независимо от того, что я чувствую, делают мой код самым четким. Это - конечно, субъективная вещь в некоторой степени.
import X
или
from X import *
или
from X import a, b, c
Где X модуль Python, Вы хотите использовать.
Это было бы полезно, чтобы Вы дали нам пример кода Python, что Вы думаете очищенные потребности.
Несомненно, динамизм Python делает это тривиальным. Если у Вас был класс, проложенный под землей глубоко в пространстве имен: foo.bar.baz.blah, можно сделать:
def foo:
f = foo.bar.baz.blah
f1 = f()
Отметьте это
from foo import bar
работы, даже если bar
модуль в foo
пакет. Это позволяет Вам ограничить свое загрязнение пространства имен, не имея необходимость называть каждую функцию/класс в foo.bar
то, что Вы могли бы хотеть использовать. Это также помогает читателям Вашего кода, потому что они будут видеть вызов к bar.baz()
и имейте лучшую идею где baz
прибыл из.