【问题标题】:Why C++ CLI has no default argument on managed types?为什么 C++ CLI 没有托管类型的默认参数?
【发布时间】:2013-03-16 20:31:42
【问题描述】:

以下行有错误Default argument is not allowed

public ref class SPlayerObj{
private:

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

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

【问题讨论】:

  • "C++" 没有托管类型,"C++/CLI" 有;你应该更新问题
  • 答案很可能会变成“因为”之类的东西。
  • @StephenLin 我更新了标题
  • @sehe 实际上,至少部分原因是因为 C++ 默认参数是由调用者而不是被调用者评估的,所以它们必须是函数元数据的一部分才能从其他函数中工作语言...C# 添加了默认参数,我不记得它们是如何在那里工作的...无论如何这比 C++/CLI 的初始开发更新
  • 如果将int 更改为System::Int32 会发生什么?

标签: visual-c++ c++-cli default-parameters


【解决方案1】:

它确实有可选参数,只是它们看起来与 C++ 语法不同。可选参数是语言互操作问题。它必须由进行调用的语言实现,它生成实际使用默认参数的代码。对于旨在简化互操作的语言(如 C++/CLI)来说,这是一个棘手的问题,您当然不知道将使用哪种语言进行调用。或者,如果它甚至具有可选参数的语法。例如,C# 语言直到版本 4 才出现。

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

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

【讨论】:

  • 你知道[DefaultParameterValue]是否在VS2012中修复了吗?
  • C++/CLI 自 VS2005 以来没有改变。
【解决方案2】:

除了精确的answer from 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);
    }
}

【讨论】:

  • 所以,它跟 Java 一样烂!
【解决方案3】:

另一种解决方案是将[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);

【讨论】:

  • 这里有很多拳击比赛。顺便说一句,即使是 nullptr,你也可以使用 s->HasValue。它要快得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多