gpt4 book ai didi

c++ - 为什么 C++ 隐式转换有效,但显式转换会抛出错误(具体示例)?

转载 作者:行者123 更新时间:2023-12-05 01:22:34 24 4
gpt4 key购买 nike

我试图在 C++ 中重载转换运算符以进行练习,但我遇到了一个问题,我无法弄清楚问题所在。在示例中,您可以隐式转换 fine,但当您尝试显式转换时会导致错误。

struct B
{
B() = default;
B( B& rhs ) = default;
};

struct A
{
operator B()
{
return B();
}
};

int main()
{
A a;
B example = a; //fine
B example2 = static_cast<B>(a); //error
}

错误是:

error C2440: 'static_cast': cannot convert from 'A' to 'B'

message : No constructor could take the source type, or constructor overload resolution was ambiguous

只有在 B 结构中定义复制构造函数时才会出现此问题。但是,如果您也定义了移动构造函数,或者让复制构造函数接受一个 const B& ( B( const B& rhs ) ),那么问题就迎刃而解了。

我认为问题在于显式转换不明确,但我不明白这是怎么回事。

我在看一个类似的问题,here ,但在那种情况下,我可以很容易地看到多个转换选项是如何导致歧义的,而我在这里看不到。

最佳答案

static_cast<B>(a);

这个表达式是一个右值,更宽泛地描述为一个临时值。

B 类没有合适的构造函数。 B( B &rhs) 构造函数不合适,可变左值引用不绑定(bind)到临时对象,因此编译失败。

关于c++ - 为什么 C++ 隐式转换有效,但显式转换会抛出错误(具体示例)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73682188/

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