海湾合作委员会C++错误?(T)x 匹配 X::运算符 const T&() const 与 clang 的



我遇到了GCC和clang之间的差异(在godbolt测试的大量版本都有相同的差异(,转换运算符匹配。现在使用巴里较短的复制代码-也可以在godbolt上找到。

struct X {
template <typename T>
operator T const&() const;
};
int i = X();

转换为intoperator T const&() const是否匹配(clang说是/GCC需要operator T() const来避免:

<source>:6:9: error: cannot convert 'X' to 'int' in initialization
6 | int i = X();
|         ^~~

C++17标准的相关部分是15.3转换[class.conv]。其中15.3.5表示。。。

函数过载解决方案(16.3.3(选择最佳转换函数来执行转换。

。。。这几乎是最重要的。16.3.3是最佳可行函数[over.match.Best]的一节,但通常与16.3.2可行函数[ver.match.bast]

从为给定上下文构建的候选函数集(16.3.1(中,选择一组可行函数

这就提出了一个问题,即GCC是否认为operator const T&() const是一个不可行的候选人,甚至不是一个候选人。然而,对候选者有效的要求非常简单:正确数量的自变量,并且"每个自变量都应该存在一个隐式转换序列(16.3.3.1(,将该自变量转换为相应的参数…">,这在这里显然是正确的,所以我认为GCC决不能将operator const T&() const视为候选者,这将带我们进入16.3.1候选函数和参数列表[over.match.funcs],特别是16.3.1/7:

在每种候选函数模板为函数模板的情况下,候选函数模板专业化为使用模板参数推导生成(17.8.3、17.8.2(。然后将这些候选者处理为候选人以通常的方式发挥作用。

假设template <typename T> void f(const T&);可以用int参数类型调用,我认为GCC应该像clang一样,将转换运算符视为有效的候选者。

不过,我很感激你的确认/想法。如果大家都同意,我会提出一份针对GCC的错误报告。

这是T.C.指出的GCC错误。

相关内容

最新更新