The attribute do not catch runtime cases.

Copy elision is well mastered now and most of the "fill or modify a value for me" should be a return by value or an object constructor. The rare functions that are still capable of be better than return by value are those like std::getline as it allow to remove an allocation at each call ( and that one still have good solution now if you dare ). 

To me, a rule against non const reference do not have to ask for non const pointer instead but ask for a better code design…