namedtuple does not work out of the box yet (though it is on our roadmap). In your example it is de-sugared to a regular tuple. You can see what’s going on under the hood with the .code property of the traced code. For example
from collections import namedtuple
MyTuple = namedtuple('MyTuple', ['output1', 'output2'])
def f(x):
    output_tuple = MyTuple(x * 2, x / 2)
    return output_tuple
traced = torch.jit.trace(f, (torch.ones(2, 2)))
print(traced.code)

Outputs
def forward(self,
    x: Tensor) -> Tuple[Tensor, Tensor]:
  _0 = (torch.mul(x, CONSTANTS.c0), torch.div(x, CONSTANTS.c0))
  return _0

In C++ you can access the tuple like this
torch::IValue output = my_module->forward(...);
std::vector<torch::IValue>& tuple_elements = output->toTuple().elements();