Является ли это объявление Eigen :: Tensor в C ++ безопасным или содержит ошибки? И я должен представить вопрос для этого? - PullRequest
0 голосов
/ 17 января 2019

Используя неподдерживаемый модуль Тенгора Эйгена, если я это сделаю:

    size_t dim0 = 3;
    size_t dim1 = 2;
    size_t dim2 = 4;
    Eigen::Tensor<double, 3> var(dim0, dim1, dim2);

Я получаю следующую ошибку:

/usr/local/include/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h:287:167: error: non-constant-expression cannot be narrowed from type 'unsigned long' to 'std::__1::array<long, 3>::value_type' (aka 'long') in initializer list [-Wc++11-narrowing]

Но код компилируется нормально, если я явно приведу измерения к long int:

    long int dim0 = 3;
    long int dim1 = 2;
    long int dim2 = 4;
    Eigen::Tensor<double, 3> var(dim0, dim1, dim2);

Вопросы:

  1. Для какой переменной размера это станет небезопасным? Если вообще?
  2. Конечно, Эйген должен вообще принимать тип (size_t) в качестве аргумента измерения? Должен ли я подать отчет об ошибке для этого или это предполагаемое поведение здесь?

Я использую C ++ 11, clang на Mac OSX (не тестировал другие платформы).

1 Ответ

0 голосов
/ 17 января 2019

Предупреждение о сужении появится для любого типа, который нельзя преобразовать в long без потерь. Так что это означает size_t, но также long long на некоторых платформах.

Как правило, индексы цикла должны быть подписаны, поэтому Eigen принимает решение хранить long для размеров.

Для получения дополнительной информации об этом есть некоторые темы cppcon (в основном Chandler Carruth) о неопределенном поведении, которые помогают компилятору.

...