4

这看起来像是 clang 中的一个问题(我已经打开了一个bug 到 clang),但我想确定我没有做错。

考虑以下代码:

struct B { };

template<typename...>
struct D;

template<typename T, typename U, typename... A>
struct D<T, U, A...>: D<U, A...> {
    using C = D<U, A...>; // (1)
    // using D<U, A...>::D; // (2)
    // using C::C; // (3)
    using C::D; // (4)
};

template<typename T>
struct D<T>: T { using T::T; };

int main() {
    D<int, double, B> d{};
}

第 (2) 行(如果注释掉 (1) 和 (4))和 (3)(如果注释掉 (4))按预期工作,而 (1)(上面的示例)给出以下错误:

11:错误:
使用 C::D 解析为没有“typename”的依赖使用声明;

[...]

11:错误:使用声明引用'C::',它不是'D'的基类,
使用C::D;

无论如何,C是 的别名D<U, A...>,即 的基类D<T, U, A...>
据我所知,该片段应该编译。我错了吗?

请注意,GCC 至少从v4.8.1v6.1编译它。

4

1 回答 1

0

正如在clang的票中提到的,它不能被认为是一个错误(也许):

Clang 遵循核心问题 2070 ( http://wg21.link/cwg2070 ) 的方向,这与原始提案的意图相匹配(参见http://wg21.link/n2540中“解决方案大纲”的结尾)。因此,这是按预期工作的。要继承构造函数,您需要在 :: 前后使用相同的标识符。

于 2016-06-05T18:48:06.043 回答