Custom class for a borrowed unique_ptr?
My question: Is borrowed_ptr silly? Is it a faux pas? Does it feel like a code smell? 


It seems a bit overengineered to me (YMMV).


  Do you feel I should rather do 1., 2. or something else altogether?


Something else. Consider this alternative:

class Master {
private:
    std::vector&lt;std::unique_ptr&lt;Child&gt;&gt; children;
    ...
public:
    // an observed ptr is not modified in any way by client code
    typedef Child const * const ObservedChildPtr;

    ObservedChildPtr get_child(int index) const;
};


This has the following advantages:


the semantics for an observed (i.e. not modified) pointer became part of the class' API
it is explicit and self-explanatory (like your borrowed_ptr)
it is minimalistic (you don't define/need the extra class)
it provides a natural expansion point, in case you actually do need the extra class (see line above) - if you need to expand it, replace Child const * const with a class definition.
client code can be written in terms of Master::ObservedChildPtr (which you can change later without having to update client code).