The question mark matches the existence of the preceding character or character class zero or one time only:
$ echo "tt" | awk '/to?t/{print $0}'
$ echo "tot" | awk '/to?t/{print $0}'
$ echo "toot" | awk '/to?t/{print $0}'
$ echo "tt" | sed -r -n '/to?t/p'
$ echo "tot" | sed -r -n '/to?t/p'
$ echo "toot" | sed -r -n '/to?t/p'
In the first two examples, the character o exists zero and one time, whereas in the third example, it exists two times, which doesn't match the pattern
In the same way, you can use the question mark with the character class:
$ echo "tt" | awk '/t[oa]?t/{print $0}'
$ echo "tot" | awk '/t[oa]?t/{print $0}'
$ echo "toot" | awk '/t[oa]?t/{print $0}'
$ echo "tt" | sed -r -n '/t[oa]?t/p'
$ echo "tot" | sed -r -n '/t[oa]?t/p'
$ echo "toot" | sed -r -n '/t[oa]?t/p'
The third example only doesn't match because it contains the o character two times.
Note that when using the question mark with the character class, it doesn't need to have all of character class in the text; one is enough to pass the pattern