gpt4 book ai didi

c++ - 模板模板参数和转发引用

转载 作者:可可西里 更新时间:2023-11-01 15:46:22 24 4
gpt4 key购买 nike

假设我们有以下代码:

template<typename T>
class C
{};

template <typename T, template <typename> class Container>
void dummyMe(Container<T>&&)
{};

int main(int argc, char* argv[])
{
C<int> c;
dummyMe(c);
return 0;
}

由于第一个 dummyMe 而无法编译参数是右值引用。有人可以用 Standardese 向我解释为什么模板模板参数与转发引用不一致,为什么用简单的英语就是这样。

附言我偶然发现了 thisthat问题,但我没有在答案中看到任何真正的证据。


上面链接的答案和这个问题的答案断言 Container<T>不能算作模板参数。我看不出为什么会这样。让我们让这个例子更简单:

template <template <typename=int> class Container>
void dummyMe(Container<>&&)
{};

现在我们有一个几乎与以下相同的示例:

template <typename Container>
void dummyMe(Container&&)
{};

但这是以完全不同的方式对待的。为什么?为什么是Container<>&&不能将 template <typename=int> class Container 视为同一件事作为Container&&typename Container

最佳答案

[temp.deduct.call/3] 中描述了术语“转发引用” (来自 C++17 草案 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).

在你的例子中 Container<T>不是模板参数,它是由模板参数组成的类型 TContainer .为了让引用真正被转发,可以使用T&&只要。同时 Conatiner是一个模板参数,你不能引用模板(上面的段落甚至明确提到了它)。 类型 Container<T>模板不同Container .这是一个实例化的类。1

虽然您可以使用 SFINAE 获取只能绑定(bind)到容器类型的转发引用,但我个人认为您最好只重载该函数。

template <typename T, template <typename> class Container>
void dummyMe(Container<T>&&)
{}

template <typename T, template <typename> class Container>
void dummyMe(Container<T>&)
{}

<子>1 [temp.spec/2] - 从类模板实例化的类称为实例化类

关于c++ - 模板模板参数和转发引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45790970/

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