c++ - 函数模板参数推导是否应该考虑转换运算符?

标签 c++ templates language-lawyer template-argument-deduction

考虑以下 code :

template<typename>
struct S 
{
    operator S<int&>();  
};

template<typename T>
void f(S<T&>);

int main() 
{
    f(S<int&&>{});  // gcc ok
                    // clang error
}
gcc 在临时参数上使用转换运算符,返回 S<int&>S<T&> 匹配,并接听电话。
clang 不考虑转换运算符,无法匹配 T&反对 int&& , 并拒接来电。
那么语言说这里应该发生什么?

最佳答案

GCC在这里肯定是错误的:T&T&&是 [temp.deduct.type]/8 中的不同行,因此不兼容。为什么这样做尚不清楚。在另一个方向犯错会更有意义:如果参数被声明为 S<T&&>并且参数的类型是 S<int&> ,至少会有一个 T (即, int& )使得(由于引用折叠)参数和参数类型相同。 (如果说涉及到通用引用,也很容易犯错误。)

关于c++ - 函数模板参数推导是否应该考虑转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63590084/

相关文章:

c++ - const char* 在平行区域内改变它的值

c++ - make_shared 与自定义新运算符

python - 谷歌应用引擎 : objects passed to a template changes their addresses in memory

c++ - xvalue 上的下标表达式的值类别

c++ - 为什么在其他函数中声明的函数不参与参数相关查找?

C++写入字节的文件 vector

c++ - 随着计算的进行,我的 C++ 程序变慢了

templates - 部分变量不可见

templates - Handlebar.js在父模板中包含另一个模板

c++ - 在具有引用成员的对象上使用放置 `new` 的结果