gpt4 book ai didi

C++:显式关键字编译错误

转载 作者:行者123 更新时间:2023-12-01 14:48:25 24 4
gpt4 key购买 nike

以下代码抛出编译错误:

#include <stdio.h>

class Option
{
Option() { printf("Option()\n"); };
public:
explicit Option(const Option& other)
{
printf("Option(const)\n");
*this = other;
}

explicit Option(Option& other)
{
printf("Option(non-const)\n");
*this = other;
}

explicit Option(const int&)
{
printf("Option(value)\n");
}
};

void foo(Option someval) {};

int main()
{
int val = 1;
Option x(val);
foo(x);
}

抛出的错误是:
main.cpp:31:10: error: no matching function for call to ‘Option::Option(Option&)’
foo(x);
^
main.cpp:5:5: note: candidate: ‘Option::Option()’
Option() { printf("Option()\n"); };
^~~~~~
main.cpp:5:5: note: candidate expects 0 arguments, 1 provided
main.cpp:25:6: note: initializing argument 1 of ‘void foo(Option)’
void foo(Option someval)

如果我从 explicit Option(const Option& other) 中删除了显式关键字,错误就会消失。

有人可以向我解释编译错误的原因是什么吗?
另外,如果 explicit Option(const Option& other) 之间存在差异和 explicit Option(Option& other) ?

最佳答案

通话中foo(x) , 全新 Option必须创建,这将成为 someValfoo 执行期间的 body 。即,x需要复制到someVal .编译器本质上尝试初始化 Option someVal(x); (先尝试 Option(Option&) ,然后是 Option(Option const&) ),但不能,因为你说这两个构造函数都是 explicit并且不应隐式调用。使用 C++17,您可以显式插入缺少的构造函数调用以使其工作:foo(Option(x)) .在 C++17 之前,无法调用 foo ,因为编译器会不断尝试向 Option 插入对构造函数的调用。但没有一个可用于插入。

在标准语言中,函数调用如 foo(x)调用参数 someValx 复制初始化.从某个类的对象或派生类的对象复制初始化某个类的对象只考虑该目标类的转换构造函数。 “转换构造函数”只是“不是 explicit 的构造函数”的一个奇特名称。然后通过正常的重载决议选择其中最好的构造函数。因为你的构造函数都不是 explicit ,这总是失败和 foo在 C++17 之前是不可调用的。从 C++17 开始,当参数是纯右值时(如在 foo(Option(x)) 中),调用构造函数的要求可以被回避和 foo变得可调用。

关于你的问题:

Also, if there a difference between explicit Option(const Option& other) and explicit Option(Option& other)?



当然:第一个 promise 不会修改其参数,而第二个则不会。您已经知道它们可以被定义为做不同的事情,并且根据上下文,重载解析会更喜欢一种而不是另一种:
Option x(1);
Option const y(2);
Option a(x); // calls Option(Option&) if available, which may modify x; calls Option(Option const&) if not, which shouldn't modify x
Option b(y); // must call Option(Option const&) because that promises not to modify y; cannot call Option(Option&) because it may modify y

关于C++:显式关键字编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60895192/

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