gpt4 book ai didi

c++ - 函数参数的隐式实例化

转载 作者:可可西里 更新时间:2023-11-01 16:34:08 25 4
gpt4 key购买 nike

我试图弄清楚函数参数的隐式实例化是如何工作的。由于某些原因,在第一个示例中,bar()调用解释 {12,41}作为初始化列表。如果我更改 foo签名auto foo(std::pair<int,int> bar) {12,41}隐式转换为 std::pair<int,int> .

例如

template<typename T, typename U>
auto foo(std::pair<T,U> arg) { return arg; }
auto bar() { return foo({12,41}); }

因错误而失败:

<source>: In function 'auto bar()':
104 : <source>:104:50: error: no matching function for call to 'foo(<brace-enclosed initializer list>)'
auto bar() { return foo({12,41}); }
^
103 : <source>:103:6: note: candidate: 'template<class T, class U> auto foo(std::pair<_T1, _T2>)'
auto foo(std::pair<T,U> arg) { return arg; }
^~~
103 : <source>:103:6: note: template argument deduction/substitution failed:
104 : <source>:104:50: note: couldn't deduce template parameter 'T'
auto bar() { return foo({12,41}); }
^

但是

auto foo(std::pair<int,int> arg) { return arg; }
auto bar() { return foo({12,41}); }

有效。有人愿意详细说明原因吗?

最佳答案

出于通常的原因:隐式转换往往不会以与模板函数相同的方式(或根本不会)发生。在你的第二个例子中:

auto foo(std::pair<int,int> arg) { return arg; }
auto works() { return foo({12,41}); }

foo是函数,不是函数模板。 std::pair有一个非显式的、两个参数的构造函数:http://en.cppreference.com/w/cpp/utility/pair/pair .具有 n 个条目的大括号包可以隐式转换为具有 n 元隐式构造函数的类型。所以你从 {12,31} 得到隐式转换至 std::pair<int, int> .

调用函数模板时,模板推导将尝试推导模板以使参数匹配。在这个过程中,全方位的隐式转换是不可用的。只允许非常特殊的少数转换:http://en.cppreference.com/w/cpp/language/template_argument_deduction .基本上是 CV 转换、派生到基数的转换以及一些指针限定和函数指针转换。

所以:

template <class T, class U>
auto foo(std::pair<T, U> arg) { return arg; }
auto bar() { return foo({12,41}); }

失败,因为当foo被调用时,它会尝试将模板参数替换为 foo使调用参数和参数匹配,但不能使它们匹配得足够精确。

我不是在评论 pair<auto, auto>语法,但情况与更明确的语法完全相同,所以我认为这不是问题的核心。

这已经在 SO 上讨论过:C++ implicit type conversion with template ,因此值得阅读以获取更多信息。虽然,请注意那里接受的答案错误地说匹配函数模板时只允许更改 CV 资格;这不完全正确(也许我会在那里提出修改建议)。

关于c++ - 函数参数的隐式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45818562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com