考虑以下代码(摘自operator)
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)
}如注释所述,以下一行确实含糊不清,因为有两种选择(转换函数和转换构造函数同样适用)
To t2 = f; //compile error但是,正如注释所述,如果从const函数中删除conversion,则会产生以下代码:
struct From {
operator To() {return To();} // conversion function
};调用编译得很好。
const限定符不应该影响conversion函数的返回值,那么为什么调用不再是模糊的?
发布于 2018-10-10 14:44:10
const限定符不应影响转换函数的返回值。
这并不会影响到这一点,但这也与此无关。
它影响的是参数--这是对this的隐式引用。隐式参数是const成员函数的const l值,非const成员函数的非const值。参数是影响过载解析的因素。
在原始代码中,构造函数和转换操作符参数都是完全相同的,因此从任何类型到任何参数的转换序列都是相同的,因此也是不明确的。
如果没有const,您的非constructor表达式f不需要任何转换,而构造函数确实需要转换为constructor。因此,该操作符是首选的过载解析。如果您已经编写了const From f;,那么它的参数为const的构造函数就会被选中,因为在这种情况下,非const转换运算符甚至都不是有效的候选。
发布于 2018-10-10 14:41:49
const限定符不应该影响转换函数的返回值,那么为什么调用不再是模糊的?
它不影响结果,但影响过载分辨率,以选择最佳可行的方法。它类似于这些组合函数的情况
To make(From const&);
To make(From&);在make(f)中哪种重载更匹配?这是第二个,因为参数类型是非const,更好地匹配参数(f),它本身就是非const。
https://stackoverflow.com/questions/52742580
复制相似问题