繁体   English   中英

具有用户定义类型的自动非类型模板参数

[英]Auto non-type template parameter with user defined types

27:35的 视频中Bryce Lelbach给出了以下示例:

template<auto... Dims>
struct dimensions {};

struct dynamic_extent {};
constexpr dynamic_extent dyn = {};

dimensions<64, dyn, 32> d;

此代码无法编译。 海湾合作委员会抱怨:

<source>:8:27: error: 'struct dynamic_extent' is not a valid type for a template non-type parameter
     dimensions<64, dyn, 32> d;
                           ^

Clang抱怨说:

<source>:8:20: error: a non-type template parameter cannot have type 'dynamic_extent'
    dimensions<64, dyn, 32> d;
                   ^
<source>:2:22: note: template parameter is declared here
    template<auto... Dims>
                     ^

他的例子是完全错的(这很奇怪,因为他指的是使用这个想法的图书馆)或者我没有得到什么?

是的,他的榜样是错的。

非类型模板参数在P0732之前不能具有类类型,这是一个C ++ 20特性。 即使在C ++ 20中,这仍然是格式不正确的,因为为了选择使用dyn作为非类型模板参数,您需要:

struct dynamic_extent {
    auto operator<=>(dynamic_extent ) = default;
};

那时,它会起作用。


我认为他的意思是:

dimensions<64, &dyn, 32> d;
//             ^^^^

传递指针很好 - 指针是C ++ 17(以及之前的方式)中可接受的非类型模板参数,只要它们满足一些其他要求 - 这是dyn所做的。

那个例子是错的。 这在C ++ 17中不起作用。 非类型模板参数必须是以下之一:

  • std::nullptr_t
  • 积分型
  • 左值引用类型(对象或函数)
  • 指针类型(对象或函数)
  • 指向成员类型的指针(指向成员对象或成员函数)
  • 枚举类型

任意类类型不在此列表中。


请注意,使用枚举作为标记类型会起作用:

template<auto... Dims>
struct dimensions {};

enum class dynamic_extent {};
constexpr dynamic_extent dyn = {};

dimensions<64, dyn, 32> d;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM