Search code examples
c++-cli

C++/CLI, "constant" reference to a tracking handle


I have spotted something like this in code:

void foo(IList<int>^ const & list ) { ... }

What does this ^ const& mean? I looked in the C++/CLI specification, but found no comments on making constant tracking references, nor the ^& combo.

Is this legal?


Solution

  • It's a reference which is constant to a tracking handle.

    It allows you to pass the handle by reference instead of by value. Presumably the author thinks it's more efficient than copying the handle.

    If the author meant to make the handle constant he should have used either of

    Method(TestClass const ^ const & parameter) 
    Method(TestClass const^ parameter)
    

    Or alternatively Method(TestClass const^& parameter) - but the caller must const up the handle first with TestClass const^ constHandle = nonConstHandle

    An example of each:

    // test.cpp : Defines the entry point for the console application.
    
    #include "stdafx.h"
    
    ref class TestClass
    {
    public:
    
        void setA(int value)
        {
            a = value;
        }
    
        TestClass() : 
            a(10)
        {
        }
    
    private:    
        int a;
    };
    
    class TakesHandle
    {
    public:
    
        void methodX1(TestClass const ^ const & parameter)
        {
        // Un-commenting below causes compiler error
        // parameter->setA(11);
        }
    
        void methodX2(TestClass const^ parameter)
        {
        // Un-commenting below causes compiler error
        // parameter->setA(11);
        }
    
        void methodX3(TestClass const^& parameter)
        {
        // Un-commenting below causes compiler error
        // parameter->setA(11);
        }
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        TakesHandle takes;
        TestClass ^ test1 = gcnew TestClass();
    
        // compiles
        takes.methodX1(test1);
    
        // compiles
        takes.methodX2(test1);
    
        TestClass const ^ constHandle = test1;
        takes.methodX3(constHandle);
    
        return 0;
    }