gpt4 book ai didi

c++ - 类型别名是否用作函数签名的函数参数类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:19 24 4
gpt4 key购买 nike

考虑一个例子:

#include <iostream>
#include <vector>

template <class, class T>
using alias = T;

template <template <class...> class>
struct tt_wrapper{};

template <class...>
struct t_wrapper{};

struct A {
template <template <class...> class TT, class T>
void foo(alias<tt_wrapper<TT>, T>) { std::cout << "A::foo invoked" << std::endl; }
};

struct B: A {
using A::foo;
template <class U, class T>
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
};

int main() {
B b;
b.foo<std::vector>(int{});
}

根据 [namespace.udecl]/15 :

When a using-declaration brings names from a base class into a derived class scope, member functions and member function templates in the derived class override and/or hide member functions and member function templates with the same name, parameter-type-list, cv-qualification, and ref-qualifier (if any) in a base class (rather than conflicting).

所以显然模板参数不应该参与成员函数隐藏。然而,在我们的示例中,模板参数是使用别名带到签名中的。尽管如此clang似乎并不认同别名是函数parameter-type-list 的一部分并声称:

prog.cc:26:7: error: no matching member function for call to 'foo'
b.foo<std::vector>(int{});
~~^~~~~~~~~~~~~~~~
prog.cc:21:10: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'U'
void foo(alias<t_wrapper<U>, T>) { std::cout << "B::foo invoked" << std::endl; }
^
1 error generated.

我特意省略了 gcc,因为它在隐藏过程中涉及模板参数列表。 clang 对吗?

最佳答案

A::fooB::foo

  • 同名 (foo)
  • 参数类型列表(T !!!)
  • cv-qualification(不是const,不是volatile)
  • ref-qualifier(无)

不考虑模板参数列表。

基类中的方法不是虚拟的,所以隐藏而不是覆盖。

Demo parameter-type-list 是 T 的事实。

关于c++ - 类型别名是否用作函数签名的函数参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46805276/

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