为什么C++ CLI在托管类型上没有默认参数?

Moh*_*kar 13 c++-cli visual-c++ default-parameters

以下行有错误Default argument is not allowed.

public ref class SPlayerObj{
private:

    void k(int s = 0){ //ERROR
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么C++在托管类型上没有默认参数?
我想知道是否有办法解决这个问题.

Han*_*ant 14

它确实有可选参数,它们看起来与C++语法看起来不一样.可选参数是语言互操作问题.它必须由进行调用的语言实现,它生成实际使用默认参数的代码.在一种旨在使互操作变得简单的语言中,这是一个棘手的问题,比如C++/CLI,你当然不知道将使用什么语言进行调用.或者,如果它甚至具有可选参数的语法.例如,C#语言直到版本4才出现.

如果语言确实支持它,那么编译器如何知道默认值是什么.值得注意的是VB.NET和C#v4选择了不同的策略,VB.NET使用了一个属性,C#使用了modopt.

您可以在C++/CLI中使用[DefaultParameterValue]属性.但你不应该,结果是不可预测的.

  • 自VS2005以来,C++/CLI没有改变. (4认同)

hol*_*roy 10

除了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 所以,它和Java一样蹩脚! (2认同)

Aar*_*don 5

另一种解决方案是使用[OptionalAttribute]旁边的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);
Run Code Online (Sandbox Code Playgroud)