【发布时间】:2016-09-01 17:45:27
【问题描述】:
考虑以下几点:
struct X {
template <class T> operator T(); // #1
template <class T> operator T&(); // #2
};
int a = X{}; // error: ambiguous
int& b = X{}; // calls #2
int const& c = X{}; // calls #2
b 的情况很简单,#2 是唯一可行的候选人。什么规则表明#2 优先于#1 用于初始化int const&,但两者对于int 的初始化有歧义?
【问题讨论】:
-
[over.match.conv] 和 [over.match.ref] 似乎是一个很好的起点。
-
@jaggedSpire 这些部分指示候选函数是什么。不是如何喜欢(或不喜欢)其中一个。
-
这里的模板不是必须的,普通的
operator int和operator int&也是模棱两可的 -
"那些非显式转换函数......产生类型“对 cv2 T2 的左值引用”(在初始化左值引用时......)其中“cv1 T”是引用兼容的([dcl .init.ref]) 与“cv2 T2”,是候选函数“似乎向我表明了初始化左值类型的限制,这将取消
int const&的#1 的资格@ -
@TemplateRex 我知道这很明确。问题是为什么
a模棱两可,而不是c。
标签: c++ language-lawyer overload-resolution conversion-operator