考虑以下简单示例
struct C
{
template <typename T> operator T () {return 0.5;}
operator int () {return 1;}
operator bool () {return false;}
};
int main ()
{
C c;
double x = c;
std::cout << x << std::endl;
}
使用 Clang 编译时,会出现以下错误
test.cpp:11:12: error: conversion from 'C' to 'double' is ambiguous
double x = c;
^ ~
test.cpp:4:5: note: candidate function
operator int () {return 1;}
^
test.cpp:5:5: note: candidate function
operator bool () {return false;}
^
test.cpp:3:27: note: candidate function [with T = double]
template <typename T> operator T () {return 0.5;}
^
1 error generated.
其他编译器会产生类似的错误,例如 GCC 和 Intel iclc
如果我删除operator int
和operator bool
. 它编译良好并按预期工作。如果只删除其中一个,即保留模板运算符并说operator int
,则始终选择非模板版本。
我的理解是,只有当模板和非模板重载函数在它们完全匹配或都需要相同的转换顺序的意义上相等时,才会首选非模板版本。但是在这种情况下,编译器似乎没有将运算符模板视为完美匹配。并且当同时存在bool
和int
重载时,它自然会认为它们是模棱两可的。
总之,我的问题是,为什么在这种情况下,运算符模板不被认为是完美匹配的?