我可以通过引用传递参数的函数/方法和在C++中通过值传递的重载吗?

JMC*_*125 5 c# c++ c++-cli pass-by-reference pass-by-value

在C#中,这肯定是可能的,因为这个可编译的例子可以显示:

static void Teste(int x) { }
static void Teste(ref int x) { }
static void Teste()
{
    int i = 0;
    Teste(i);
    Teste(ref i);
}
Run Code Online (Sandbox Code Playgroud)


但是可以使用构造函数在C++(/ CLI)中完成吗?请参阅以下示例:

class Foo
{
    Foo(int bar)
    {
        // initializing "Foo" instance...
    }
    Foo(int &bar)
    {
        // initializing "Foo" instance...
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

虽然这个类确实使用这些构造函数进行编译,但是当我应用另一个时,我无法看到如何选择,也就是说,调用是ambiguos,因为在C#中没有为此目的知道的关键字"ref".我在构造函数中尝试了它,其中名称必须与类相同(当然我可以添加一个无用的参数,但我想知道我是否不能这样做).

顺便说一句,我用谷歌搜索,只有"通过参考和价值之间有什么区别?" 但没有像这样覆盖超载.而且我想作为变通方法,我可以使用指针,这要归功于"取地址"(&); 或者,如上所述,还有一个额外无用的参数.但我想知道的是:我可以像这样重载(通过ref/by value)吗?

提前致谢,

Cap*_*ous 1

您可以通过提供对所需类型的显式转换来在 C++ 中完成类似的操作。

struct Foo
{
    Foo(int /*bar*/) {}
    Foo(int &/*bar*/) {}
};


int main()
{
    int value = 5;
    Foo foo(static_cast<const int&>(value));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

强制转换const将导致重载解析忽略采用非常量引用的构造函数,并决定按值传递。