[gelöst] Benutzung von temporäre Variablen verhindern



  • Hallo,

    gibt es eine Möglichkeit, Funktionsaufrufe über temporäre Variablen zu verhindern? Ich habe dieses Konstrukt:

    class scoped_access
    {
       int const& Value_;
    public:
       scoped_access( int const& value ) :
          Value_( value )
       {
       }
       
       int const& value() const
       {
          return Value_;
       }
    };
    
    class test
    {
       int Value_;
    
    public:
       test( int value ) :
          Value_( value )
       {
       }
    
       [[nodiscard]] scoped_access lock_value() const
       {
          return scoped_access( Value_ );
       }
    };
    
    int main()
    {
       test t( 5 );
       
       // Zugriff nur über scoped_access erlauben...
       // ...so soll die Benutzung aussehen
       scoped_access const sa = t.lock_value();
       int const& v1 = sa.value();
    
       // ... und das soll nicht übersetzen
       int const& v2 = t.lock_value().value();
    }
    

    Hat jemand eine Idee?



  • @DocShoe

    Ich glaube ref-qualifier könnten dein Problem lösen:

    class scoped_access
    {
        int const& Value_;
    public:
        scoped_access(int const& value) :
            Value_(value)
        {
        }
    
        int const& value() const &
        {
            return Value_;
        }
    
    
        int const& value() const&& = delete;
        
    };
    
    class test
    {
        int Value_;
    
    public:
        test(int value) :
            Value_(value)
        {
        }
    
        [[nodiscard]] scoped_access lock_value() const
        {
            return scoped_access(Value_);
        }
    };
    
    int main()
    {
        test t(5);
    
        // Zugriff nur über scoped_access erlauben...
        // ...so soll die Benutzung aussehen
        scoped_access const sa = t.lock_value();
        int const& v1 = sa.value();
    
        // ... und das soll nicht übersetzen
        int const& v2 = t.lock_value().value();
    }
    
    


  • @Quiche-Lorraine

    Top! Funktioniert.



  • Edit: Hey cool, die Ref-Qualifier muss ich mir dann doch nochmal genauer ansehen. Meine ursprünglich Antwort war so doch nicht ganz korrekt 🙂


Anmelden zum Antworten