相关疑难解决方法(0)

C++中的函数重载按值或引用传递参数

如果我们在C++中有这个示例函数代码

void foo(int x)  { std::cout << "foo(int)"   << std::endl; }
void foo(int& x) { std::cout << "foo(int &)" << std::endl; }
Run Code Online (Sandbox Code Playgroud)

是否可以区分调用哪些函数在调用参数中进行任何修改?

如果以某些方式调用函数foo:

foo( 10);

i = 10;
foo( static_cast<const int>(i));

foo( static_cast<const int&>(i)); 
Run Code Online (Sandbox Code Playgroud)

它被称为第一个foo重载函数,因为它不能通过引用将const参数传递给非const参数.但是,如何调用第二个foo重载函数呢?如果我打电话给下一个方式:

int i = 10;
foo( i);
Run Code Online (Sandbox Code Playgroud)

它发生了一个模糊的错误,因为这两个函数对这个参数都有效.

在这个链接/sf/answers/382576561/中解释了解决它的一种方法:使用对象而不是内置类型并执行私有复制构造函数,因此它无法复制对象值它必须被称为第二个foo重载函数并通过引用传递对象.但是,内置类型有什么办法吗?我必须更改函数名称以避免重载?

c++ overloading c++11

11
推荐指数
1
解决办法
1887
查看次数

当没有歧义时,是否允许通过引用进行函数重载?

考虑以下代码:

#include <iostream>

void foo(int m);
void foo(int &k);

int main()
{
    foo(5); // ok, because there is no ambiguity

    int m = 5;
    //foo(m); // compile-time error, because of ambiguity
    foo(m + 0); // ok, because it's an expression of type int and not object's lvalue
}

void foo(int m)
{
    std::cout << "by value\n";
}
void foo(int &k)
{
    std::cout << "by reference\n";
}
Run Code Online (Sandbox Code Playgroud)

我理解它引入了歧义foo(m),但是当表达式是类型int(或其他可以转换为int)时,这是否允许?

我试图在此找到一些标准参考,但没有运气.


免责声明:请注意,它不是基于Value vs. Const Reference …

c++ overloading pass-by-reference language-lawyer

8
推荐指数
2
解决办法
268
查看次数

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

在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)吗?

提前致谢,

c# c++ c++-cli pass-by-reference pass-by-value

5
推荐指数
1
解决办法
663
查看次数

C++函数重载分辨率涉及传值,引用和常量引用

假设我f在C++中使用以下3个签名定义了一些函数:

void f(int x) {}
void f(int& x) {}
void f(const int& x) {}
Run Code Online (Sandbox Code Playgroud)

这些函数可以共存,因为它们的参数类型不同.

现在我运行以下代码:

int main {
   int i = 3;
   const int ci = 4;

   f(3);
   f(i);
   f(ci);
}
Run Code Online (Sandbox Code Playgroud)

在这种特定情况下,C++如何知道要调用哪个重载函数?在C++中编写重载函数的一般规则(最佳实践?)是什么,以避免歧义.当前的C++ 14标准是否指定了任何特定的规则?

c++ overloading

3
推荐指数
2
解决办法
828
查看次数