Оператор соединения Boost, управляемых данными, «+» искажает первый столбец

Рассмотрим следующий код:

BOOST_DATA_TEST_CASE(
      sampleTest,
      (data::make(1) ^ data::make(2)) + (data::make(3) ^ data::make(4)),
      var1,
      var2)
{
  std::cout << var1 << "," << var2 << std::endl;
}

Ожидаемый результат:

1,2
3,4

Однако var1 выглядит поврежденным:

$> ./MyTests --run_test=Tests/sampleTest
Running 2 test cases...
202875304,2
202875304,4

*** No errors detected
$> ./MyTests --run_test=Tests/sampleTest
Running 2 test cases...
83976616,2
83976616,4

*** No errors detected

Я делаю что-то неправильно?


person Addy    schedule 04.01.2018    source источник
comment
Я получаю предупреждение (рассматриваемое как ошибка, так как я использую -Werror) в строке набора данных: error: returning reference to temporary [-Werror=return-local-addr]. Используете ли вы высокий уровень предупреждений и получаете ли вы такие предупреждения?   -  person Fred Larson    schedule 04.01.2018
comment
@FredLarson Я никогда не получал предупреждений, но если я превращаю его в ошибку, я действительно вижу это: join.hpp:57:58: error: returning reference to local temporary object [-Werror,-Wreturn-stack-address]   -  person Addy    schedule 04.01.2018
comment
Да, что-то в этом вызывает неопределенное поведение. Я думаю, что это как-то связано с объединением результатов zip-архивов, но раньше я не пробовал тесты на основе данных.   -  person Fred Larson    schedule 04.01.2018


Ответы (1)


Это ошибка. Короче говоря: пожалуйста, сообщите об этом мейнтейнерам библиотеки.

Действительно, операция zip возвращает кортеж std::tuple<int const&, int const&>:

и хотя сам набор данных на данный момент жив, кортеж возвращается по ссылке в операции join...:

    sample const&       operator*() const   { return m_first_size > 0 ? *m_it1 : *m_it2; }

Правильным решением будет расширение концепцию набора данных, чтобы иметь не только тип ::sample¹, но и тип ::reference. Это довольно инвазивное изменение.


¹ странным образом в настоящее время не задокументировано

person sehe    schedule 05.01.2018
comment
Вы, вероятно, должны были включить ссылку, чтобы им не приходилось делать двойную работу. - person sehe; 06.01.2018