使用类型别名继承基类构造函数的正确方法?

Osy*_*otr 5 c++ inheritance templates using language-lawyer

我试图继承名称很长的模板基类的构造函数。对于这个基类,我引入了类型别名。(https://godbolt.org/z/aqf6czPdo

class Object {};
class Gadget {};

class SuperBase : public Object { using base_t = Object; };
class Params : public Gadget { using base_t = Gadget; };

template<class T, class TParams>
class Base : public SuperBase, public TParams {};

template<class T>
class Derived : public Base<T, Params>
{
    using base_t = Base<T, Params>;
public:
    using base_t::base_t;
};
Run Code Online (Sandbox Code Playgroud)

此代码可以使用 GCC 和 Clang 成功编译,但不能使用 MSVC/permissive-标志进行编译

error C2385: ambiguous access of 'base_t'
note: could be the 'base_t' in base 'SuperBase'
note: or could be the 'base_t' in base 'Params'
Run Code Online (Sandbox Code Playgroud)

如果我这样写using base_t::Base;,那么MSVC编译成功,但clang失败。使用完整的基类名称using Base<T, Params>::Base;适用于所有三个编译器。

问题是在这种情况下哪个编译器是正确的?

我预计所有三个编译器都会成功编译此代码。stackoverflow 上的许多答案表明类型别名实际上可以用于继承基类构造函数。

Dav*_*ing 4

这是一个 MSVC bug:[class.qual]/1.2(C++20 中的/2.2)清楚地表明,出现在两侧的相同::名称表示继承构造函数。当前的措辞将这种词法处理限制为依赖的 using-declarator ([namespace.udecl]/1),但当然这是。(注入的类名是非依赖名称的触发器,因为构造函数根本可以通过名称查找直接找到。)

\n