gpt4 book ai didi

c++ - 我不明白这个重载是如何解决的 "works"

转载 作者:搜寻专家 更新时间:2023-10-31 00:06:23 25 4
gpt4 key购买 nike

我有一个 C++ 类,其中针对不同的数据类型重载了构造函数。一个说明问题的简化示例是:

#include <iostream>
#include <vector>
#include <string>

class c {
public:

c(const std::string& n, int v) :
name(n),
int_value(v)
{
std::cout << "Running <int> constructor" << std::endl;
}

c(const std::string& n, double v, const std::vector<double>& extra_args) :
name(n),
double_value(v)
args(extra_args)
{
std::cout << "Running <double> constructor" << std::endl;
}



private:
std::string name;
int int_value;
double double_value;
std::vector<double> args;
};


int main(int argc, char **argv) {
c i("name", int());

// This line should in my opinion not compile at all; but
// it ends up calling the (std::string&, int) constructor.
c d("name", double());
}

如你所见,构造函数采用 double参数期望和附加 std::vector<double>争论。我的期望是 c::c("name", double())调用根本不应该编译 - 我指望编译器在重构过程中帮助我,而是调用了采用整数参数的构造函数,然后事情就变得一团糟。

所以当我编译并运行示例程序时,输出是:

Running <int> constructor
Running <int> constructor

而我根本没想到它会编译。

最佳答案

对于重载决策,编译器首先必须检查重载是否可以接受调用时提供的参数数量。这是一个确定哪些函数对于此函数调用表达式可行的过程。

第一个重载只能接受两个,而第二个重载只能接受三个。在这两种情况下,都会立即取消第二次过载的资格。因此,重载集包含一个用于两个调用的成员。

现在编译器必须查看它是否可以形成从每个参数到每个参数类型的转换序列。 "name" 文字通过构造函数转换为 std::stringdouble 隐式转换为 int。因此,对于集合中唯一且唯一的重载,形成转换序列是成功的。因此,它被调用。

关于c++ - 我不明白这个重载是如何解决的 "works",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com