gpt4 book ai didi

c++ - 为什么C++在对Foo ::Foo(T &&)的调用中不能推断T?

转载 作者:行者123 更新时间:2023-12-01 12:16:08 25 4
gpt4 key购买 nike

给定以下模板结构:

template<typename T>
struct Foo {
Foo(T&&) {}
};

这将进行编译,并将 T推导为 int:
auto f = Foo(2);

但这不能编译: https://godbolt.org/z/hAA9TE

int x = 2;
auto f = Foo(x);

/*
<source>:12:15: error: no viable constructor or deduction guide for deduction of template arguments of 'Foo'
auto f = Foo(x);
^

<source>:7:5: note: candidate function [with T = int] not viable: no known conversion from 'int' to 'int &&' for 1st argument
Foo(T&&) {}
^
*/

但是, Foo<int&>(x)被接受。

但是,当我添加一个看似多余的用户定义的演绎指南时,它会起作用:
template<typename T>
Foo(T&&) -> Foo<T>;

如果没有用户定义的推导指南,为什么不能将 T推导为 int&

最佳答案

我认为这里之所以会引起混淆,是因为关于转送引用的综合演绎指南存在特定的异常(exception)情况。

确实,从构造函数生成的用于类模板自变量推导的候选函数与从用户定义的推导指南生成的候选函数看起来完全相同,即:

template<typename T>
auto f(T&&) -> Foo<T>;

但是对于从构造函数生成的引用, T&&是一个简单的右值引用,而在用户定义的情况下,它是一个转发引用。这由C++ 17标准的 [temp.deduct.call]/3指定(草稿N4659,强调我的):

A forwarding reference is an rvalue reference to a cv-unqualified template parameter that does not represent a template parameter of a class template (during class template argument deduction ([over.match.class.deduct])).



因此,由类构造函数合成的候选者将不会像从转发引用中推断出 T一样(它可以推断 T为左值引用,因此 T&&也是左值引用),而只会推断出 T作为非引用,因此 T&&始终是右值引用。

关于c++ - 为什么C++在对Foo <T>::Foo(T &&)的调用中不能推断T?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60470661/

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