Подтвердить что ты не робот

Почему С++ CLI не имеет аргументов по умолчанию для управляемых типов?

Следующая строка имеет ошибку Default argument is not allowed.

public ref class SPlayerObj{
private:

    void k(int s = 0){ //ERROR
    }
}

Почему С++ не имеет аргумента по умолчанию для управляемых типов?
Я хотел бы знать, есть ли способ исправить это.

4b9b3361

Ответ 1

У него есть необязательные аргументы, они просто не выглядят так же, как синтаксис С++. Необязательные аргументы - проблема взаимодействия между языками. Он должен быть реализован языком, который делает вызов, и генерирует код, который фактически использует аргумент по умолчанию. Какая сложная проблема на языке, который был разработан для упрощения взаимодействия, например с С++/CLI, вы, конечно, не знаете, на каком языке будет звонить. Или, если у него даже есть синтаксис для необязательных аргументов. Язык С# не делал до версии 4, например.

И если язык поддерживает его, как этот компилятор знает, что такое значение по умолчанию. Примечательно, что VB.NET и С# v4 выбрали разные стратегии, VB.NET использует атрибут, С# использует modopt.

Вы можете использовать атрибут [DefaultParameterValue] в С++/CLI. Но вы не должны, результат не предсказуем.

Ответ 2

Помимо точного ответа от Hans Passant, ответ на вторую часть о том, как исправить это, вы можете использовать несколько методов с тем же именем для имитации аргумента аргумента по умолчанию.

public ref class SPlayerObj {
  private:
    void k(int s){ // Do something useful...
    }
    void k() { // Call the other with a default value 
       k(0);
    }
}

Ответ 3

Альтернативным решением является использование параметра [OptionalAttribute] вдоль стороны a Nullable<int>. Если параметр не указан вызывающим абонентом, он будет nullptr.

void k([OptionalAttribute]Nullable<int>^ s)
{
    if(s == nullptr)
    {
        // s was not provided
    }
    else if(s->HasValue)
    {
        // s was provided and has a value
        int theValue = s->Value;
    }
}
// call with no parameter
k();
// call with a parameter value
k(100);