首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么具有非const转换函数的下面的代码是不含糊的?

为什么具有非const转换函数的下面的代码是不含糊的?
EN

Stack Overflow用户
提问于 2018-10-10 14:29:59
回答 2查看 82关注 0票数 3

考虑以下代码(摘自operator)

代码语言:javascript
复制
struct To {
    To() = default;
    To(const struct From&) {} // converting constructor
};

struct From {
    operator To() const {return To();} // conversion function
};

int main()
{
    From f;

    To t2 = f; // copy-initialization: ambiguous
// (note, if conversion function is from a non-const type, e.g.
//  From::operator To();, it will be selected instead of the ctor in this case)
}

如注释所述,以下一行确实含糊不清,因为有两种选择(转换函数和转换构造函数同样适用)

代码语言:javascript
复制
To t2 = f; //compile error

但是,正如注释所述,如果从const函数中删除conversion,则会产生以下代码:

代码语言:javascript
复制
struct From {
    operator To() {return To();} // conversion function
};

调用编译得很好。

const限定符不应该影响conversion函数的返回值,那么为什么调用不再是模糊的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-10 14:44:10

const限定符不应影响转换函数的返回值。

这并不会影响到这一点,但这也与此无关。

它影响的是参数--这是对this的隐式引用。隐式参数是const成员函数的const l值,非const成员函数的非const值。参数是影响过载解析的因素。

在原始代码中,构造函数和转换操作符参数都是完全相同的,因此从任何类型到任何参数的转换序列都是相同的,因此也是不明确的。

如果没有const,您的非constructor表达式f不需要任何转换,而构造函数确实需要转换为constructor。因此,该操作符是首选的过载解析。如果您已经编写了const From f;,那么它的参数为const的构造函数就会被选中,因为在这种情况下,非const转换运算符甚至都不是有效的候选。

票数 1
EN

Stack Overflow用户

发布于 2018-10-10 14:41:49

const限定符不应该影响转换函数的返回值,那么为什么调用不再是模糊的?

它不影响结果,但影响过载分辨率,以选择最佳可行的方法。它类似于这些组合函数的情况

代码语言:javascript
复制
To make(From const&);
To make(From&);

make(f)中哪种重载更匹配?这是第二个,因为参数类型是非const,更好地匹配参数(f),它本身就是非const。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52742580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档