No. If you create one, it won’t be relayed or mined by Bitcoin Core. If it gets into a block, it will be rejected. From the source code for Bitcoin Core (
if (tx.vout.empty()) return state.DoS(10, false, REJECT_INVALID, "bad-txns-vout-empty");
However, you can create a vout with 0 satoshis. That isn’t a “standard” transaction, so it will not be mined by the software by default. However, if it gets into a block, it’s valid.
There is another way you could do it. Using the
OP_RETURN in a transaction output forces anyone referencing that output to fail spending it(the script returns and transaction is invalid). Although the output exists, it is provably unspendable.