gpt4 book ai didi

c++ - 在 `using Base::operator T` 是模板类型参数的情况下,是否允许 `T`?

转载 作者:IT老高 更新时间:2023-10-28 23:21:39 30 4
gpt4 key购买 nike

考虑这个例子:

struct B { operator int(); };

template<class T>
struct X:B
{
using B::operator T;
};

GCC接受代码,而 Clang MSVC 拒绝它。哪个是正确的?

注意,如果基类型是依赖的,所有的编译器都接受代码:

template<class T>
struct B { operator T(); };

template<class T>
struct X:B<T>
{
using B<T>::operator T;
};

最佳答案

我认为 GCC 是对的,在 §7.3.3/1 中,我们可以找到:

The set of declarations introduced by the using-declaration is found by performing qualified name lookup (3.4.3, 10.2) for the name in the using-declaration, excluding functions that are hidden as described below.

我看不出有什么原因导致找不到 operator T,实际上:

template<class T>
struct X: B {
T f () { return B::operator T; }
};

...使用 g++ 和 clang 可以正常编译(未在 MSVC 上测试)。

我在特定于用于限定名称查找的转换函数的标准中找不到任何内容,除了:

Since specializations of member templates for conversion functions are not found by name lookup, they are not considered when a using-declaration specifies a conversion function (14.5.2).

但是B::operator int不是成员函数模板的特化,所以上面不应该考虑。

关于c++ - 在 `using Base::operator T` 是模板类型参数的情况下,是否允许 `T`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38608687/

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