这是错误还是C ++语言功能

时间:2019-10-10 03:19:45

标签: c++ templates language-lawyer

以下代码可以正常工作:

#include <type_traits>

template <typename> class AddLayer;

template <template <typename> class TLayer>
struct LayerInputPortSet
{
    using type = int;
};

template <>
struct LayerInputPortSet<AddLayer>
{
    using type = float;
};

using type = typename LayerInputPortSet<AddLayer>::type;
static_assert(std::is_same_v<type, float>);

但进行以下修改:

#include <type_traits>

template <typename> class AddLayer;

template <template <typename> class TLayer>
struct LayerInputPortSet
{
    using type = int;
};

template <>
struct LayerInputPortSet<AddLayer>
{
    using type = float;
};

template <template<typename> class TLayer>
struct Sublayer
{
    template <typename TInputs>
    using LayerType = TLayer<TInputs>;
};

using type = typename LayerInputPortSet<Sublayer<AddLayer>::template LayerType>::type;
static_assert(std::is_same_v<type, float>);

据我了解,由于“类型别名声明引入了可以用作由type-id表示的类型的同义词的名称”,因此Sublayer<AddLayer>::template LayerTypeAddLayer的别名,因此根据模板的专长,type应该为float

此代码可在GCC上运行,但无法在clang 6,clang 7,clang 8和VS 2019上进行编译。实际上,如果我将最后一行更改为:

static_assert(std::is_same_v<type, int>);

可以在clang 6,clang 7,clang 8和VS 2019上编译代码。

我不知道哪个编译器的行为正确:GCC或Clang / VS?

非常感谢!

0 个答案:

没有答案