make_tuple
принимает аргумент как const int&
(так как это постоянное lvalue и принимает аргумент T&&
), а привязка ссылки к значению является ODR-использованием.
Оба случая плохо сформированы, диагнозы c не требуются. Например, при высоких уровнях оптимизации g cc вся программа оптимизирована и ошибок компоновщика нет, а при отсутствии оптимизации оба оператора дают ошибки компоновщика.
Чтобы не использовать ODR, вы можете преобразовать его в rvalue:
// Various ways to force the lvalue-to-rvalue conversion
auto t = std::make_tuple(int(Test::VALUE));
auto t1 = foo(std::make_tuple((void(), Test::VALUE)));
auto t2 = foo(std::make_tuple(+Test::VALUE));
(так std::make_tuple
принимает int&&
временного)
Или вы можете сделать определение inline
(проще всего с помощью constexpr
):
class Test {
public:
static constexpr int VALUE = 100;
};